临时绑定到左值引用

时间:2009-08-28 06:42:16

标签: c++ compiler-construction lvalue rvalue

我有以下代码

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

int main()
{
    mutate(three()); 
    return 0;
}

您可以看到我将 three()传递给 mutate 方法。这段代码汇编得很好。我的理解是,临时工具不能分配给非const引用。如果是,该程序如何编译?

有什么想法吗?

修改

编译器尝试过:VS 2008和VS2010 Beta

5 个答案:

答案 0 :(得分:8)

它用于在VC6编译器中编译,所以我猜维护后向兼容性VS2008正在支持这种非标准扩展。尝试使用/Za(禁用语言扩展名)标记,然后您应该收到错误。

答案 1 :(得分:4)

这是VC ++的邪恶延伸。如果您使用/ W4编译,则编译器将发出警告。我想你正在阅读Rvalue References: C++0x Features in VC10, Part 2。这篇文章也提到了这个问题。

答案 2 :(得分:3)

这是一个Microsoft扩展,用于模仿许多其他微软编译器的行为。如果启用W4警告,您将看到警告。

答案 3 :(得分:1)

编译,至少使用g ++ 4:

foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’

(行号是3或4,因为我必须添加#include和'using'行。)

因此,您的编译器似乎没有它应该的那么严格。

答案 4 :(得分:0)

我想这取决于编译器。 g ++ 4.1.2给了我这个。

In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.

也许是因为你没有做任何事情,电话会被优化掉。