为什么不允许对一个临时对象进行非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) 下面这行是什么意思?为什么允许这样做,因为 0 是右值而不是变量名?const这句话的意义何在?
const int &x = 0;
Run Code Online (Sandbox Code Playgroud) int val2 = 38;
int *ptr = &val2;
const int *&ptrRef = ptr; // ERROR
int i = 92;
int &ref_i = i;
const int &ref_i2 = ref_i; // OK
Run Code Online (Sandbox Code Playgroud)
为什么我不能有一个引用非常量指针的常量引用?我认为如果你访问 constptrRef标识符,它将被视为val2const。当您访问 时ptr,它将被视为val2非常量。这适用于代码的底部部分,所以我不明白为什么它不适用于指针。
允许使用以下非常简单的代码:
class s
{
public:
};
const s& tt = std::move(s()); // Also valid without 'const'
Run Code Online (Sandbox Code Playgroud)
但是现在我想知道为什么允许它。
首先我们使用 std::move一个右值(临时值)并将其标记为右值引用,但是为什么左值引用可以绑定到右值引用?
是否因为右值引用也是右值?
导致左值引用绑定到右值引用的基本原理(或标准引号)是什么?我可以做到的。
编辑:msvc2015允许非常量左值引用绑定到右值引用,问题仍然是常量左值引用绑定到右值引用。抱歉,我应该指定我使用的编译器。
有谁知道,为什么下面的代码没有发出警告?
struct Foo
{
int a = 1;
};
struct Bar
{
Foo getString()
{
return Foo();
}
};
int main()
{
Bar a;
const Foo& b = a.getString(); <--- Foo getString() becomes Foo&?
}
Run Code Online (Sandbox Code Playgroud)