Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio中从右值到左值的转换_C++_Visual Studio - Fatal编程技术网

C++ Visual Studio中从右值到左值的转换

C++ Visual Studio中从右值到左值的转换,c++,visual-studio,C++,Visual Studio,在Visual Studio 2012RC中有一些非标准扩展。例如,此代码编译: #include <string> using namespace std; void value(string& value) { value = "some"; } int main() { value(string("nice")); } #包括 使用名称空间std; 无效值(字符串和值) { value=“some”; } int main() { 值(字符串(“

在Visual Studio 2012RC中有一些非标准扩展。例如,此代码编译:

#include <string>

using namespace std;

void value(string& value)
{
    value = "some";
}

int main()
{
    value(string("nice"));
}
#包括
使用名称空间std;
无效值(字符串和值)
{
value=“some”;
}
int main()
{
值(字符串(“nice”);
}

并得到警告,这是非标准扩展。所以,我想了解它是如何真实的,以及代码是如何转换的(右值引用或常量引用与常量转换)?

基本上,VS会将空间分配到某个地方,让引用指向它,就好像它是对-
常量的引用,而没有常量(或者在C++11中是右值引用)

您可以使用下的
/Za
(禁用语言扩展)编译器开关禁用此行为

属性->C/C++->语言


如果我记得正确,在标准C++中,

你不能将一个临时值(rValue/<代码>字符串(“漂亮”)< /C> >绑定到一个非const引用(LValk),但是微软编译器允许它。警告告诉您,代码是由于扩展而编译的,不会使用任何其他编译器编译。

类类型的临时对象仍然是对象。它存在于内存中的某个地方,这意味着编译器能够将引用附加到它上并没有什么不寻常的地方。在物理层面上,无论是常量引用还是非常量引用都没有区别。换句话说,在这种情况下,语言限制纯粹是概念性的、人为的。编译器只是忽略了这个限制。这里没有必要“改造”任何东西。引用只是直接附加到对象,不管该对象位于何处

基本上,对于提供外部单词访问其
this
指针的值(或具有
*this
的左值访问)的类,可以立即轻松地模拟其行为

struct S {
  S& get_lvalue() { return *this; }
};

void foo(S& s);
...

foo(S().get_lvalue());

上述代码完全合法,并围绕上述限制进行工作。您可以将MSVC++行为视为与此等效。

AFAIK,Visual Studio 2010(可能还有2008)也支持此行为。VC++编译器允许修改临时对象。注意这是最差的样式和最坏的bug():FLAMGIOO:嗯,在C++中修改临时对象从来都是非法的。它总是被允许调用C++中临时的非const修改成员函数。然而,使用“直接”语法附加非常量引用是非法的。如我的回答所示,前者实际上允许一个人绕过后者。谢谢。回答得好。接受,但启用/ZA不好,因为任何正确的代码都不会编译(在C++11下)。谢谢。有趣。接受。如果我们在职能部门之外储备临时人员,这会导致UB吗?@Guillaume07:你能重新措辞吗?我不明白你所说的“股票”是什么意思。@Andrey:对不起,我指的是股票:如果你在函数之外保留一个临时变量的引用,那么MSVC扩展可能也会延长临时变量的寿命