C++ 如果这是唯一可能的解决方法,那么是什么阻止移动构造函数用于重载解决?
考虑以下代码段:只能使用默认构造函数或移动操作构建OnlyMoveable 在这种特殊情况下,至少对我来说,似乎没有歧义,构造k应该调用move构造函数 为什么自动右值引用转换不在标准中?在操作仅移动类型时,这将节省许多“冗长”的std::move 如果在不可能出现歧义的情况下进行此类转换,会有什么风险或不清楚C++ 如果这是唯一可能的解决方法,那么是什么阻止移动构造函数用于重载解决?,c++,C++,考虑以下代码段:只能使用默认构造函数或移动操作构建OnlyMoveable 在这种特殊情况下,至少对我来说,似乎没有歧义,构造k应该调用move构造函数 为什么自动右值引用转换不在标准中?在操作仅移动类型时,这将节省许多“冗长”的std::move 如果在不可能出现歧义的情况下进行此类转换,会有什么风险或不清楚 struct OnlyMoveable { OnlyMoveable() {} OnlyMoveable(const OnlyMoveable& other)
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就是这样。你的意思是因为语言允许你做其他危险的事情,它应该允许所有危险的事情吗?不是真的。我的问题是,是否还有其他东西(然后是潜在的危险代码…)会阻止自动右值转换。是语言规则阻止了它,但我相信动机至少部分是不允许危险代码。