Сегодня я был очень удивлен, обнаружив, что Intel icpc (версия 14.0.2, использующая std=c++0x
) не может скомпилировать следующий фрагмент.
#include <type_traits>
namespace traits_tests {
template<typename>
struct sfinae_true : std::true_type {};
template<typename T>
static auto value_type(int) -> sfinae_true<typename T::value_type>;
template<typename T>
static auto value_type(void*) -> std::false_type;
}
template<typename C>
struct has_value_type
: decltype(traits_tests::value_type<C>(0)) {};
жалоба на последнюю строку:
inc/traits.h(258): error: expected an identifier
: decltype(traits_tests::value_type<C>(0)) {};
^
Код отлично работает с clang
и gcc
.
Я действительно не хочу полностью переписывать, чтобы заставить его работать с дефектными компиляторами (почему коммерческие компиляторы всегда ошибочны?).
- Есть ли более простой способ, чем совершенно другой шаблон SFINAE, заставить его работать с
icc
?
EDIT: Да, я знаю, что icc
уже некоторое время поддерживает decltype
. Но в приведенном выше конкретном контексте icc
не поддерживает его. Также обратите внимание, что использование std=c++11
вместо std=c++0x
не имеет значения.
export
. ;-) - person DevSolar   schedule 30.05.2014decltype
поддерживается начиная с v12, поэтому я нахожу это странным. - person WhozCraig   schedule 30.05.2014template
— см. здесь — т. е. попробуйтеdecltype(template traits_tests::value_type<C>(0)) {};
. - person Tony Delroy   schedule 30.05.2014export
был лишь частично реализован одним Комо и был оставлен Комитетом мертвым как функция, потому что он просто не работал. - person Quentin   schedule 06.04.2017