Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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++ 为什么要继续使用常量对象?_C++_C++11_Move_Move Semantics - Fatal编程技术网

C++ 为什么要继续使用常量对象?

C++ 为什么要继续使用常量对象?,c++,c++11,move,move-semantics,C++,C++11,Move,Move Semantics,我有一个简单的代码: const std::vector<int> data = {1,2,3}; std::vector<int> data_moved=std::move(data); for(auto& i:data) cout<<i;//output is 123 const std::vector data={1,2,3}; std::vector data_moved=std::move(数据); 用于(自动和输入:数据) 你不能

我有一个简单的代码:

const std::vector<int> data = {1,2,3};
std::vector<int> data_moved=std::move(data);
for(auto& i:data)
    cout<<i;//output is 123
const std::vector data={1,2,3};
std::vector data_moved=std::move(数据);
用于(自动和输入:数据)
你不能移动任何东西。

std::move
的名字真的很糟糕:它不强制移动;它只返回一个右值。由编译器决定调用
std::vector
的哪个构造函数,这就是决定是否移动的因素

如果由于目标的move构造函数不匹配而无法移动容器,则将通过基本重载规则使用copy构造函数

#include <iostream>

struct T
{
    T() = default;
    T(const T&) { std::cout << "copy ctor\n"; }
    T(T&&)      { std::cout << "move ctor\n"; }
};

int main()
{
    T a;
    T b = std::move(a);   // "move ctor"

    const T c;
    T d = std::move(c);   // "copy ctor" - `const T&&` only matches copy ctor



    // (shut up GCC)
    (void) b;
    (void) d;
}
#包括
结构T
{
T()=默认值;

T(常数T&){std::cout哪个编译器?什么命令行标志?来吧。因为const&&也可以绑定到const&。这是有效的行为。@LightnessRacesinOrbit@omid:不,我的意思是,你的问题应该包括你正在使用的编译器的详细信息以及你如何使用它。否则它不是一个完整的测试用例。他还可以通过包装vecto来禁用复制r进入另一个名为
MyVector
的类,例如,实现
vector
定义的相同构造函数,将
operator=
设为私有,然后尝试执行相同的操作并得到编译错误。@staticx:这将是荒谬的。是的,但至少可以证明复制正在发生,而不是移动,或者更确切地说move semanticsnx我明白了..我认为最好删除const&&ctor..T(const T&&)=delete;