【发布时间】:2014-07-28 16:40:26
【问题描述】:
编译:
template < class T, class Y, class ...Args >
struct isSame
{
static constexpr bool value = std::conditional<
sizeof...( Args ),
typename std::conditional<
std::is_same< T, Y >::value,
isSame< Y, Args... >, // Error!
std::false_type >::type,
std::is_same< T, Y > >::type::value;
};
int main()
{
qDebug() << isSame< double, int >::value;
return EXIT_SUCCESS;
}
给我这个编译器错误:
error: wrong number of template arguments (1, should be 2 or more)
问题是isSame< double, int > 有一个空的Args 参数包,所以isSame< Y, Args... > 实际上变成了与签名不匹配的isSame< Y >。
但我的问题是:为什么要评估那个分支? sizeof...( Args ) 是 false,因此不应评估内部 std:conditional。这不是运行时代码,编译器知道sizeof..( Args ) 将永远在给定模板类型下是true。
如果你好奇,它应该是std::is_same 的可变参数版本,而不是它的工作原理......
【问题讨论】:
-
详细解释见this answer。
标签: c++ templates c++11 conditional