【发布时间】:2019-07-05 02:07:07
【问题描述】:
我遇到了 gcc 编译器将局部变量(不是临时的)作为右值参数移动到函数的问题。 我有一个简单的例子:
class A
{
public:
A() {}
A& operator=(const A&) { std::cout << "const A&\n"; return *this; }
A& operator=(A&&) { std::cout << "A&&\n"; return *this; }
};
class B
{
public:
B() {}
B& operator=(const B&) { std::cout << "const B&\n"; return *this; }
B& operator=(B&&) { std::cout << "B&&\n"; return *this; }
template<class T> B& operator=(const T&) { std::cout << "const T& (T is " << typeid(T).name() << ")\n"; return *this; }
template<class T> B& operator=(T&&) { std::cout << "T&& (T is " << typeid(T).name() << ")\n"; return *this; }
};
int main(int argc, char **argv)
{
A a1;
A a2;
a1 = a2;
B b1;
B b2;
std::cout << "B is " << typeid(B).name() << "\n";
b1 = b2;
}
输出:
const A&
B is 1B
T&& (T is 1B)
我没想到,因为移动赋值将右值归零。就我而言,它导致崩溃是因为在 b1=b2; 之后使用了 b2;
问题是为什么会发生。
【问题讨论】:
-
我在您显示的代码中看不到任何“将右值归零”。请尝试创建minimal reproducible example 向我们展示。
-
b1=b2b2后面的一行会被删除,那为什么不优化代码,用移动代替复制呢?在我看来这是一个聪明的优化。 -
哦,如果您在代码崩溃方面需要帮助,请直接询问。也请阅读how to ask good questions,以及this question checklist。
-
阅读参考折叠和完美转发
标签: c++ templates c++14 move-assignment-operator lvalue-to-rvalue