在 Visual Studio 2012RC 中存在一些非标准扩展。例如这段代码编译:
#include <string>
using namespace std;
void value(string& value)
{
value = "some";
}
int main()
{
value(string("nice"));
}
并收到警告说它是非标准扩展。所以,我想了解它是如何真实的以及代码如何转换(右值引用或带有 const_cast 的 const 引用)?
类类型的临时对象仍然是一个对象。它位于内存中的某个位置,这意味着编译器能够附加对它的引用并没有什么异常。在物理层面,无论是 const 引用还是非 const 引用都没有区别。换句话说,在这种情况下,语言限制纯粹是概念上的、人为的。编译器只是忽略该限制。这里没有必要“改变”任何东西。引用只是直接附加到对象,无论该对象位于何处。
基本上,对于一个为外部词提供访问其值的类this
指针(或使用左值访问*this
)可以立即轻松地模拟行为
struct S {
S& get_lvalue() { return *this; }
};
void foo(S& s);
...
foo(S().get_lvalue());
上面的代码是完全合法的,并且它可以绕过上述限制。您可以将 MSVC++ 行为视为与此等效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)