左值左值转换Visual Studio

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

#include <string> using namespace std; void value(string& value) { value = "some"; } int main() { value(string("nice")); } 

并得到警告,这是非标准的扩展。 所以,我想明白,它是如何真实的,以及如何转换代码(rvalue参考或与const_cast const引用)?

类types的临时对象仍然是一个对象。 它居住在内存中,这意味着在编译器中没有任何exception可以附加引用。 在物理层面,无论是const引用还是非const引用都没有区别。 换句话说,在这种情况下,语言限制纯粹是概念性的,人为的。 编译器只是忽略了这个限制。 这里没有必要“改造”任何东西。 引用只是直接附加到对象,无论对象发生在哪里。

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

 struct S { S& get_lvalue() { return *this; } }; void foo(S& s); ... foo(S().get_lvalue()); 

上面的代码是完全合法的,它围绕上述的限制。 您可以将MSVC ++行为视为等同于此。

基本上,VS将分配空间的某个地方,只是让它的参考点, 就好像它是一个没有const的引用(或在C ++ 11右值引用)。

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

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

如果我没记错的话。

在标准的C ++中,你不能将一个临时(rvalue / string("nice") )绑定到一个非const引用(左值),但是微软编译器允许它。 警告告诉你,代码是由于扩展而编译的,不会与任何其他编译器一起编译。