【发布时间】:2018-10-31 14:29:50
【问题描述】:
我无法理解为什么以下复制初始化无法编译:
#include <memory>
struct base{};
struct derived : base{};
struct test
{
test(std::unique_ptr<base>){}
};
int main()
{
auto pd = std::make_unique<derived>();
//test t(std::move(pd)); // this works;
test t = std::move(pd); // this doesn't
}
unique_ptr<derived> 可以移动到unique_ptr<base>,那么为什么第二个语句有效,而最后一个无效?执行复制初始化时是否不考虑非显式构造函数?
来自 gcc-8.2.0 的错误是:
conversion from 'std::remove_reference<std::unique_ptr<derived, std::default_delete<derived> >&>::type'
{aka 'std::unique_ptr<derived, std::default_delete<derived> >'} to non-scalar type 'test' requested
从 clang-7.0.0 开始
candidate constructor not viable: no known conversion from 'unique_ptr<derived, default_delete<derived>>'
to 'unique_ptr<base, default_delete<base>>' for 1st argument
实时代码可用here。
【问题讨论】:
标签: c++ c++17 implicit-conversion unique-ptr