将临时绑定到左值引用

发布于 2024-08-02 17:23:50 字数 350 浏览 8 评论 0原文

我有以下代码,

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

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

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

有什么想法吗?

编辑:

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

I have the following code

string three()
{
    return "three";
}

void mutate(string& ref)
{
}

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

You can see I am passing three() to mutate method. This code compiles well. My understanding is, temporaries can't be assigned to non-const references. If yes, how this program is compiling?

Any thoughts?

Edit:

Compilers tried : VS 2008 and VS2010 Beta

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

窝囊感情。 2024-08-09 17:23:50

它曾经在VC6编译器中编译,所以我猜想VS2008为了保持向后兼容性而支持这个非标准扩展。尝试使用 /Za (禁用语言扩展)标志,那么你应该会得到一个错误。

It used to compile in VC6 compiler, so I guess to maintain backward comptibility VS2008 is supporting this non-standard extension. Try with /Za (disable language extension) flag, you should get an error then.

抱猫软卧 2024-08-09 17:23:50

它是VC++的邪恶扩展。如果您使用 /W4 进行编译,那么编译器会警告您。我猜您正在阅读 右值参考:VC10 中的 C++0x 功能,第 2 部分。这篇文章也提到了这个问题。

It is VC++'s evil extension. If you compile with /W4 then the compiler will warn you. I guess you are reading the Rvalue References: C++0x Features in VC10, Part 2. This article also mentioned that issue.

撩发小公举 2024-08-09 17:23:50

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

This is a Microsoft Extension, to mimic the behavoir of many other microsoft compilers. If you enable W4 warnings, you will see the warning.

夜吻♂芭芘 2024-08-09 17:23:50

无法编译,至少使用 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' 行。)

所以,你的编译器出现没有应有的严格。

It doesn't compile, with g++ 4 at least:

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&)’

(The line numbers are off by 3 or 4, because I had to add the #include and 'using' lines.)

So, your compiler appears to not be as strict as it should be.

原野 2024-08-09 17:23:50

我想这取决于编译器。 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.

也许因为你没有做任何事情,所以调用被优化掉了。

I guess it depends on the compiler. g++ 4.1.2 gives me this.

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.

Maybe because you're not doing anything the call is optimized away.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文