Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么复制构造函数使用std::move调用const变量_C++_C++14 - Fatal编程技术网

C++ 为什么复制构造函数使用std::move调用const变量

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

我在C++14中运行了以下代码。我希望没有复制构造函数,但有一个案例超出了我的理解。如何解释这个案例

#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
对象移动。移动构造函数将尝试更改传递的实例。关于
//这是对临时变量的合法引用吗?
请参阅。何时返回常量值比返回非常量更有用?