我对如何/为什么在 C++11 和 C++17 中调用构造函数感到有点困惑。
#include <iostream>
using namespace std;
//---
template<typename T>
struct StructTest
{
public:
const T Var = -1;
//---
// constexpr StructTest() = delete; // 1
// constexpr StructTest() = default; // 2
// constexpr StructTest(const StructTest &Source) = delete; // 3
// constexpr StructTest(const StructTest &Source) = default; // 4
// constexpr StructTest(const StructTest &Source) {cout << "Copy" << endl;}; // 5
};
//---
StructTest<int> A{};
StructTest<int> A1{1};
StructTest<int> A2(A);
//---
int main(void)
{
return(0);
};
因此,当我取消注释某些行组合(并使用c ++ 17标准标志与clang编译)时会发生什么,我感到困惑:
- 1、编译。列出 init 的 for
A
和A1
,以及默认的复制构造函数 forA2
- 2、编译。
A
和 list init (?) 的默认构造A1
函数,以及 A2 的默认复制构造函数 - 1 + 3 或 2 + 3,编译失败,因为删除了复制构造函数
A2
- 1 + 4,编译。
A
和 list init A1(?) 的默认构造函数,以及A2
- 2 + 4,编译。
A
和 list init (?) 的默认构造A1
函数,以及 A2 的默认复制构造函数 - 1 + 5,编译失败。说
A
缺少(删除)默认构造函数,并且没有匹配的构造函数A1
? - 2 + 5,编译失败。没有匹配的构造函数
A1
?
我想我了解其中的大部分内容,但我很困惑为什么 1 + 5 和 2 + 5 编译失败。谁能解释编译器用来选择它将使用的构造函数的逻辑,以及为什么它无法编译?
如果我认为在其他情况下被调用的构造函数是错误的,你能否指出被调用的内容,为什么?