rvalue到左值转换Visual Studio

For*_*veR 10 c++ visual-studio

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

#include <string>

using namespace std;

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

int main()
{
    value(string("nice"));
}
Run Code Online (Sandbox Code Playgroud)

并警告它是非标准扩展名.所以,我想了解它是如何实现的以及代码如何转换(使用const_cast进行rvalue-reference或const引用)?

AnT*_*AnT 8

类类型的临时对象仍然是对象.它存在于内存中的某个位置,这意味着编译器中没有任何异常可以附加对它的引用.在物理层面,无论是const引用还是非const引用都没有区别.换句话说,在语言限制纯粹是概念性的,人为的情况下.编译器只是忽略了这个限制.这里没有必要"改造"任何东西.引用只是直接附加到对象,无论该对象碰巧驻留在何处.

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

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

void foo(S& s);
...

foo(S().get_lvalue());
Run Code Online (Sandbox Code Playgroud)

上述代码完全合法,它适用于上述限制.您可以将MSVC++行为视为与此等效.