为什么不允许对一个临时对象进行非const引用,哪个函数getx()返回?显然,这是C++标准禁止的,但我对这种限制的目的感兴趣,而不是对标准的引用.
struct X
{
X& ref() { return *this; }
};
X getx() { return X();}
void g(X & x) {}
int f()
{
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ref()可以修改临时对象. ref()允许您欺骗编译器并获取此临时对象的链接,这解决了我们的问题.此外:
他们说"为const引用分配一个临时对象可以延长这个对象的生命周期","但是对于非const引用却没有任何说法".我的其他问题.以下赋值是否延长了临时对象的生命周期?
X& x = getx().ref(); // OK
Run Code Online (Sandbox Code Playgroud) 这是一个非常小的例子:
class Foo
{
public:
Foo(int x) {};
};
void ProcessFoo(Foo& foo)
{
}
int main()
{
ProcessFoo(Foo(42));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以上编译在Visual Studio上很好,但在Linux和Mac上生成错误.
编译上面会生成这个:
$ g++ -std=c++11 -c newfile.cpp
newfile.cpp: In function ‘int main()’:
newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’
ProcessFoo(Foo(42));
^
newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’
void ProcessFoo(Foo& foo)
Run Code Online (Sandbox Code Playgroud)
我找到了三个解决方法:
像这样:
Foo foo42(42);
ProcessFoo(foo42);
Run Code Online (Sandbox Code Playgroud)
ProcessFoo采用const引用: void ProcessFoo(const Foo& foo)
ProcessFoo只是让Foo按值传递. void ProcessFoo(Foo foo)
为什么编译器禁止我的原始代码?(这是什么防守)?上面三个满足编译器的解决方法中的每一个都有什么用?MSVC会允许什么,但不是g …
唯一失败的情况是通过非常量引用传递参数,因为临时变量无法绑定到它。
void DrawLine(const Vector& v1, const Vector& v2);
如果对象是临时的,为什么引用会对const临时对象的生命周期产生影响?
我想我也没有完全理解在参数中创建的临时对象的存在范围。