C++ 如果这是唯一可能的解决方法,那么是什么阻止移动构造函数用于重载解决?

C++ 如果这是唯一可能的解决方法,那么是什么阻止移动构造函数用于重载解决?,c++,C++,考虑以下代码段:只能使用默认构造函数或移动操作构建OnlyMoveable 在这种特殊情况下,至少对我来说,似乎没有歧义,构造k应该调用move构造函数 为什么自动右值引用转换不在标准中?在操作仅移动类型时,这将节省许多“冗长”的std::move 如果在不可能出现歧义的情况下进行此类转换,会有什么风险或不清楚 struct OnlyMoveable { OnlyMoveable() {} OnlyMoveable(const OnlyMoveable& other)

考虑以下代码段:只能使用默认构造函数或移动操作构建OnlyMoveable

在这种特殊情况下,至少对我来说,似乎没有歧义,构造k应该调用move构造函数

为什么自动右值引用转换不在标准中?在操作仅移动类型时,这将节省许多“冗长”的std::move

如果在不可能出现歧义的情况下进行此类转换,会有什么风险或不清楚

struct OnlyMoveable {
    OnlyMoveable() {}

    OnlyMoveable(const OnlyMoveable& other) = delete;

    OnlyMoveable(OnlyMoveable&& other) {} 
};

void dummy ()
{ 

    OnlyMoveable defaultCtor;

    OnlyMoveable j(std::move(defaultCtor));

    OnlyMoveable defaultCtor2;
    // Do not compile, because attemps to call the copy ctor. Ok, but well, why the compiler in this special case where there is no
    // other overload than the move, can automitcally perform the rvalue reference cast ? 
    //OnlyMoveable k(defaultCtor2);
};

如果不存在复制构造函数,则不会编译此初始化:

OnlyMoveable k(defaultCtor2); // error
这样调用move构造函数似乎是合理的。但是,这有一个主要问题,
defaultCtor2
将处于有效但未指定的状态。这是危险的,而且语言不会自动为您这样做,这是一件好事

当然,作为程序员,如果您知道不再需要使用
defaultCtor2
,或者至少不会读取其值,则可以使用显式
std::move
告诉编译器使用move构造函数:

OnlyMoveable k(std::move(defaultCtor2)); // ok

同意,但同时,C++中已经有很多事情至少像“危险”一样,(每个引用的lambda捕获,隐式构造函数调用,基类上的非虚析构函数,如果在Ctor中调用的操作函数是不操作的,列表不是令人兴奋的……)SooWoots就是这样。你的意思是因为语言允许你做其他危险的事情,它应该允许所有危险的事情吗?不是真的。我的问题是,是否还有其他东西(然后是潜在的危险代码…)会阻止自动右值转换。是语言规则阻止了它,但我相信动机至少部分是不允许危险代码。