【发布时间】:2015-03-26 22:02:17
【问题描述】:
我猜(某些)隐式转换适用于传递非类型模板参数时。例如,对于像std::array<int, 7> 这样的表达式,应该有从int 到std::size_t 的转换。但是,请考虑以下代码:
template <bool>
void f() {
std::cout << "false\n";
}
template <>
void f<true>() {
std::cout << "true\n";
}
int main() {
f<1>();
f<4>();
f<0>();
}
我希望 int 在此处隐式转换为 bool。但是在 VC、GCC 和 clang 上的行为是不同的。
在 VC 上,true、false 和 false 被打印出来,这对我来说真的很奇怪。
在 GCC 上,true、true 和 false 被打印出来,这是我所期望的。
在 clang 中,由于声明 f<4>();,代码根本无法编译。
候选模板被忽略:第一个模板参数的显式指定参数无效
那么,标准对此有何规定?非类型模板参数的隐式转换规则是什么?
【问题讨论】:
-
VC 的行为至少很清楚:它采用输入整数类型的 LSB 并将其用作布尔值。我仍然不知道哪种行为是正确的。
-
@MarkB 不是真的,
f<3>();仍然打印false。
标签: c++ templates type-conversion implicit-conversion template-specialization