Грешка при свързване с променливи шаблони

Разгледайте кода по-долу:

#include <iostream>

template<typename T>
T n;

int main()
{
    n<int> = 42;
    std::cout << n<int> << std::endl;
}

Той компилира и свързва с g++5.1 и показва 42. Обаче clang++ не успява да го свърже:

недефинирана препратка към n‹int›

Ако инициализирам променливата на шаблона като

template<typename T> T n{};

тогава clang++ също го свързва.

Някаква идея какво става? Правилно ли е clang++ да не успее да свърже програмата? И защо работи, ако инициализирам променливата на шаблона?

Доколкото знам, променливите на шаблона са просто синтактична захар за обвивки на шаблони около статични членове, така че n<int> = 42 ефективно специализира екземпляра int. IMO, кодът трябва да има връзка.


person vsoftco    schedule 17.06.2015    source източник
comment
Изглежда llvm.org/bugs/show_bug.cgi?id=22825   -  person dyp    schedule 17.06.2015
comment
@dyp Съгласен съм, това изглежда като проблема.   -  person JKor    schedule 17.06.2015
comment
Това е наистина. @dyp публикува отговор, а не коментар!!   -  person Lightness Races in Orbit    schedule 17.06.2015


Отговори (1)


Това е грешка в clang++ #22825. Докладът за грешка е подаден на 2015-03-06 и грешката все още не е коригирана. Ричард Смит предполага, че това определение неправилно се третира само като предварителна декларация.

person dyp    schedule 17.06.2015
comment
Съжалявам, но нямам повече информация за тази грешка. Може би ще имам известно време по-късно, за да разгледам източниците на clang. - person dyp; 17.06.2015