【发布时间】:2020-07-15 18:20:42
【问题描述】:
struct S
{
S() = default;
S(S const&) = delete;
// S(S&&) = delete; // <--- uncomment for a mind-blowing effect:
// MSVC starts compiling EVERY case O_O
};
S foo() { return {}; }
struct X : S
{
// X() : S(foo()) {} // <----- all compilers fail here
};
struct Y
{
S s;
Y() : s(foo()) {} // <----- only MSVC fails here
};
struct Z
{
S s = {}; // ... and yet this is fine with every compiler
Z() {}
};
//S s1(foo()); // <-- only MSVC fails here
//S s2 = foo(); // <-- only MSVC fails here
问题:
-
看起来没有办法用纯右值初始化不可复制的基类——这是正确的吗?看起来标准有缺陷(或者我尝试的所有编译器都不兼容)
-
MSVC 无法初始化成员变量——这是否意味着它不兼容?有没有办法解决这个问题?
-
为什么添加
S(S&&) = delete;会导致 MSVC 编译每个案例?
【问题讨论】:
-
S可以移动吗?如果你添加S(S&&) = default;,这两种底部的情况都应该编译。 -
@CoryKramer 好吧,如果 S 是可移动的,它显然会起作用。 :) 但是你把我推到另一个发现——明确删除 mctor 会导致 MSVC 编译每个案例。 O_O
-
您使用的是什么版本的 MSVC?你指定了什么语言标志?
-
@NathanOliver 检查提供的上帝螺栓链接(最新可用,
c++latest) -
你有没有试过
X是否调用S拷贝构造函数,当它存在的时候?
标签: c++ c++17 language-lawyer