以下代码在gcc 4.8.1上编译没有问题:
#include <utility>
struct foo
{
};
int main()
{
foo bar;
foo() = bar;
foo() = std::move( bar );
}
Run Code Online (Sandbox Code Playgroud)
似乎隐式生成的赋值运算符foo不是&ref-qualified,因此可以在rvalues上调用.根据标准,这是正确的吗?如果是这样,有什么理由不要求隐式生成的赋值运算符被重新&限定?
为什么标准不要求生成以下内容?
struct foo
{
foo & operator=( foo const & ) &;
foo & operator=( foo && ) &;
};
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释为什么这段代码编译:
typedef struct longlong
{
unsigned long low;
long high;
}
longlong;
typedef longlong Foo;
struct FooStruct
{
private:
Foo bar;
public:
void SetBar(Foo m)
{
bar = m;
}
Foo GetBar()
{
return bar;
}
};
int main()
{
FooStruct f;
Foo m1 = { 1,1 };
Foo m2 = { 2,2 };
f.SetBar(m1);
f.GetBar() = m2; // Here I'd expect an error such as
// "error: lvalue required as left operand of assignment"
}
Run Code Online (Sandbox Code Playgroud)
我预计编译失败的原因与error: …
你能告诉我这里发生了什么吗?为什么有可能呢?
std::make_unique<int>(1) = std::make_unique<int>(1);
Run Code Online (Sandbox Code Playgroud)
我以为这make_unique返回了一个r值......
编辑: 你能提供一些这种结构的有用例子吗?
为什么这段代码会编译?我认为ctor返回的rvalues不在内存中,因此不能用作左值.
#include <iostream>
#include <vector>
class Y {
public :
explicit Y(size_t num = 0)
: m_resource {std::vector<int>(num)}
{
}
std::vector<int> m_resource;
};
int main(int argc, const char * argv[]) {
Y(1) = Y(0); // WHAT?!?
return 0;
}
Run Code Online (Sandbox Code Playgroud) 是否有可能进行设计以及如何operator+为我的课程重载以使其成为C可能:
C&& c = c1 + c2;
Run Code Online (Sandbox Code Playgroud)
但这不可能:
c1 + c2 = something;
Run Code Online (Sandbox Code Playgroud)
编辑:我将对象更改为小写字母.c1,c2并且c是类的对象C.&&不是逻辑operator&&,而是右值参考.
例如写作:
double&& d = 1.0 + 2.0;
Run Code Online (Sandbox Code Playgroud)
是100%正确的(新)C++代码,而
1.0 + 2.0 = 4.0;
Run Code Online (Sandbox Code Playgroud)
显然是一个编译器错误.我想要完全一样,但对于我的班级,我想要双倍C.
第二次编辑: 如果我的操作符返回C或C&,我可以赋值给rvalue引用,但也可以赋值给c1 + c2,这是无意义的.给const这里禁用它,但它也禁用了对rvalue的赋值.至少在VC++ 2k10上.那么这有多重?
根据我的理解,返回rvalues对函数的引用是危险的原因是由于以下代码:
T&& f(T&& x) { do_something_to_T(x); return static_cast<T&&>(x); }
T f(const T& x) { T x2 = x; do_something_to_T(x2); return x2; }
T&& y = f(T());
Run Code Online (Sandbox Code Playgroud)
这留下y了一个未定义的悬空参考.
但是,我不明白为什么上面的代码甚至编译?是否有合理的理由将rvalue引用分配给另一个右值引用?粗略地说,rvalues不应该是"临时",即在表达结束时会变得无效吗?能够分配它们对我来说似乎很愚蠢.