为什么不允许对一个临时对象进行非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) 第一:在哪里std::move和std::forward界定?我知道他们做了什么,但我找不到任何标准标题包含它们的证据.在gcc44中,有时std::move可用,有时则不可用,因此明确的include指令会很有用.
在实现移动语义时,源可能处于未定义状态.该状态是否必须是对象的有效状态?显然,您需要能够调用对象的析构函数,并能够通过类暴露的任何方式为其分配.但其他操作是否有效?我想我要问的是,如果你的班级保证某些不变量,当用户说他们不再关心它们时你是否应该努力强制执行这些不变量?
下一篇:当你不关心移动语义时,是否有任何限制会导致非const引用在处理函数参数时优于rvalue引用? void function(T&);在void function(T&&);从呼叫者的角度来看,能够传递功能的临时值是偶尔有用,所以它好像应该授予该选项时,它是可行的,这样做的.并且rvalue引用本身就是lvalues,因此你不能无意中调用move-constructor而不是copy-constructor,或类似的东西.我没有看到一个缺点,但我确信有一个.
这让我想到了最后一个问题.您仍然无法将临时对象绑定到非const引用.但是您可以将它们绑定到非const右值引用.然后,您可以将该引用作为另一个函数中的非const引用传递.
void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() {
function1(5); //bad
function2(5); //good
}
Run Code Online (Sandbox Code Playgroud)
除了它没有做任何事情之外,该代码有什么问题吗?我的直觉当然不是,因为改变右值参考是他们存在的一个重点.如果传递的值是合法的const,编译器将捕获它并对你大喊大叫.但从各方面来看,这是一个机制的一个周期,可能是因为某种原因而存在,所以我只是想确认我没有做任何愚蠢的事情.
我知道在c ++ 03中,非const引用不能绑定到rvalues.
T& t = getT();是无效的,在c ++ 11中,我们可以这样做:T&& t = getT(); 但是上面的代码怎么样,应该在c ++ 11中工作?
我用vs11测试了下面的代码:
Foo getFoo() {
return Foo();
}
void fz(Foo& f) {
}
int getInt() {
return int();
}
void iz(int& i) {
}
int main() {
{
Foo& z = getFoo(); //ok
fz(getFoo()); //ok
int& z2 = getInt(); //error: initial value of reference to non-const must be an lvalue
iz(getInt()); //same as above
}
}
Run Code Online (Sandbox Code Playgroud)
Foo是一个自定义类,我不明白为什么前两行编译.临时引用的z是在main的内部范围的末尾被破坏.标准是否对此有所说明?
class Foo {
public: …Run Code Online (Sandbox Code Playgroud)