【发布时间】:2021-03-25 16:05:39
【问题描述】:
考虑以下最小示例:
#include <iostream>
struct X {
X() { std::cout << "Default-ctor" << std::endl; }
X(std::initializer_list<int> l) {
std::cout << "Ilist-ctor: " << l.size() << std::endl;
}
};
int main() {
X a{};
X b({}); // reads as construct from {}
X c{{}}; // reads as construct from {0}
X d{{{}}}; // reads as construct from what?
// X e{{{{}}}}; // fails as expected
}
我对a、b和c没有任何疑问,一切都很清楚
但我不明白为什么 d 有效
d 中这对额外的大括号代表什么?我查了 C++20 标准,但我不能轻易找到答案。 clang 和 gcc 都同意这个代码,所以是我错过了什么
【问题讨论】:
-
我不确定,但它可能是通过内括号初始化的另一个临时对象的复制/移动(当然,由于 C++17 的原因,它实际上不会是复制/移动规则)。
-
@chris 我用 C++14 和
-fno-elide-constructors运行它,并且没有调用任何构造函数。
标签: c++ c++20 initializer-list