c++ - MSVC : bug? 上的模板参数推导失败

标签 c++ templates visual-studio-2005

以下代码无法在 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)是左值表达式,所以你可以把它放在赋值的左边。

现在回到最初的问题。在你的情况下,abchar (&) [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/

相关文章:

c++ - 如何禁用 getter 返回的临时写入?

c++ - 将模板从类特化为整数

c++ - 检测任意成员的存在

c++ - printf 到控制台窗口和文件?

c - gethostbyname win32错误

windows-7 - Qt QLineEdit 小部件使长文本左对齐

c++ - 在函数内部重新声明函数

c++ - MSVC++ 2015 - SSE 编译器错误或程序中的错误/未定义行为?

templates - 推荐可扩展的 AngularJS 项目结构?

c++ - 对象通用计数器的研制