C++ 为什么复制构造函数使用std::move调用const变量
我在C++14中运行了以下代码。我希望没有复制构造函数,但有一个案例超出了我的理解。如何解释这个案例C++ 为什么复制构造函数使用std::move调用const变量,c++,c++14,C++,C++14,我在C++14中运行了以下代码。我希望没有复制构造函数,但有一个案例超出了我的理解。如何解释这个案例 #include <iostream> #include <vector> struct Noisy { Noisy() { std::cout << "constructed at " << this << '\n'; } Noisy(const Noisy&) { std::cout
#include <iostream>
#include <vector>
struct Noisy {
Noisy() { std::cout << "constructed at " << this << '\n'; }
Noisy(const Noisy&) { std::cout << "copy-constructed\n"; }
Noisy(Noisy&&) { std::cout << "move-constructed\n"; }
~Noisy() { std::cout << "destructed at " << this << '\n'; }
};
const std::vector<Noisy> f() {
std::vector<Noisy> v = std::vector<Noisy>(3); // copy elision
return v; // NRVO
}
void g(std::vector<Noisy> arg) {
std::cout << "arg.size() = " << arg.size() << '\n';
}
int main() {
auto v1 = f(); // OK, copy elision
const auto v2 = f(); // OK, copy elision
const auto& v3 = f(); // Is this legal referencing to temp variable?
(void) v3;
const auto v4 = v3; // OK, copy-constructed called
const auto v5 = std::move(v2); // Why, copy-constructed called
auto v6 = std::move(v1); // OK, no copy constructor
}
#包括
#包括
结构噪音{
嘈杂的{std::cout我还没有完成分析,但是,您也应该记录赋值运算符。v2
是const
。您不能从const
对象移动。移动构造函数将尝试更改传递的实例。关于//这是对临时变量的合法引用吗?
请参阅。何时返回常量值比返回非常量更有用?