2015-03-18 2 views
10

GCC, Clang, ICC и MSVC все отклоняют этот код, но я не нашел нарушения правил в последнем рабочем проекте стандарта C++.Может ли нестатический член шаблона специализироваться на данных или функциях?

Является ли правило уже стандартным, или это в отчете о дефектах?

#include <type_traits> 

template< typename t > 
struct s { 
    std::conditional_t< std::is_integral<t>::value, t, void() > mem; 
}; 

s<int> a; 
s< void * > b; 
+0

Что вы ожидаете от 'void()' должно оцениваться? – StenSoft

+0

@StenSoft 'void()' - это только тип 'mem'. Вы не можете оценить 's :: mem', потому что это имя нереализованной функции. Но это выходит за рамки вопроса. – Potatoswatter

+0

Тип функции void(), обычно используемый для вычитания типа шаблона, не определяет или не объявляет var. –

ответ

8

Код недействителен из-за 14.3.1/3:

Если декларация приобретает тип функции через тип зависит от шаблона-параметра, и это вызывает декларацию, которая не используйте синтаксическую форму декларатора функции, чтобы иметь тип функции, программа плохо сформирована.

Тип объявления здесь зависит от параметра шаблона t и поэтому не может быть типом функции.

+0

А, спасибо! Никогда бы его не искали. Это правило обсуждает зависимость типа, и оно применяется также в локальном масштабе. ИМХО было бы лучше помещено в [temp.dep.type] §14.6.2.1. – Potatoswatter

+0

... и, кстати, MSVC и ICC (v13.0.1) не могут диагностировать его в локальном масштабе. – Potatoswatter