以下代码无法在 VC++8.0 编译器上编译并出现错误(我还没有在最新的 visual studio 编译器上尝试过。)
error C2440: 'return' : cannot convert from 'const char *' to 'const char (&)[6]'
template <typename T>
inline T const& compare (T const& a, T const& b)
{
return a < b ? b : a;
}
int main()
{
::compare("string1", "string2");
}
在函数模板中,字符串似乎是 const char (&)[6]
.
据我所知,当<
应用运算符,数组应衰减为指针。
那么,这个错误可能是因为可能的错误吗?
最佳答案
这肯定是 Microsoft 编译器中的错误。
这是 C 和 C++ 的一大区别。
e0 ? e1 : e2
在 C++ 中,条件表达式 产生左值,除非第二部分中的至少一个表达式('?'
之后) ) 是一个右值,而在 C 中,条件表达式 总是产生 rvalue,无论如何。这意味着,以下代码在 C++ 中完全有效,但在 C 中是错误的:
int a=10, b=20;
(a<b?a:b) = 100; //ok in C++, but error in C
在C++中,它不会报错,正是因为表达式(a<b?a:b)
是左值表达式,所以你可以把它放在赋值的左边。
现在回到最初的问题。在你的情况下,a
和 b
是 char (&) [6]
类型的数组,以及表达式 a<b? a : b
应该产生一个左值,因为不需要数组到指针 转换。但是在 Microsoft 编译器中,似乎存在数组到指针 的转换。
为了验证它,可以这样写:
template <typename T, int N>
inline void f(T const (&a)[N]) {}
template <typename T>
inline T const& compare (T const& a, T const& b)
{
f(a < b ? b : a); //is the argument `char*` OR `char (&)[6]`?
return a < b ? b : a;
}
它给出了 no error或者(在 GCC 中),这意味着您传递给 f()
的表达式是数组,不是指针。
关于c++ - MSVC : bug? 上的模板参数推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7773718/