【发布时间】:2020-06-27 00:47:53
【问题描述】:
假设我们有以下代码:
struct some_class : parent
{
some_class(::other_class oth) :
parent(some_function(oth.some_property), std::move(oth))
{}
};
当然构造会导致未定义的行为(在我的例子中是崩溃),因为 c++ 没有指定执行顺序。但是,我怎样才能在运动之前取回财产呢?我无法更改父级。
【问题讨论】:
-
这里没有未定义的行为。
std::move只是对右值引用的强制转换。罪魁祸首是parent的构造函数中的代码。由于没有显示,因此很难知道什么可能有效。 -
没错,不是真的未定义,但绝对出乎意料。根据您使用的编译器,
some_function会在“原始”oth或“移出”oth上调用。如果oth.some_property是例如std::string,则它要么包含其原始值,要么为空。 -
some_function用它的参数做什么?std::move实际上并没有自己做任何事情。 -
@Darhuuk 只有
parent的构造函数采用第二个参数按值而不是按引用时才会出现这种情况。否则在parent的构造函数主体执行之前不会有任何问题发生。 -
@walnut 没错,我假设是这样。否则这个问题就没有意义了。
标签: c++ constructor c++17 move order-of-execution