#include <initializer_list>
#include <iostream>
namespace {
class C {
public:
C(C const &) = delete;
C(C &&) = delete;
C(int) {
std::cout << "int\n";
}
C(std::initializer_list<int>) {
std::cout << "initializer\n";
}
};
void f(C) {
}
// Compiles and prints "initializer" when called
C g() { return {0}; }
// Fails to compile
// C h() { return 0; }
} // namespace
int main() {
// Compiles and prints "initializer"
f({0});
// Fails to compile
// f(0);
}
是否可以在不调用initializer_list构造函数的情况下,将C构造为不可复制、不可移动的类型,作为函数参数或函数返回值?
struct A { std::vector<int> x{2}; }
。你不能将x
初始化为大小为2
。也不能说= 2
,因为构造函数是显式的)。 - Johannes Schaub - litbstruct A { vector<int> x = vector<int>(2); };
?我现在无法测试它,因为GCC 4.6不支持类内初始化器。 - Adam H. Petersoninitializer_list
构造函数,则它将优先于非initializer_list
构造函数,并且我无法想出一种方法使花括号初始化与int
构造函数匹配,但不与initializer_list
匹配。我能想到的所有其他构造C
的方法都涉及传递给函数或从函数返回时的(名义上的)临时对象,而这与不可复制、不可移动的类不兼容。 - Adam H. Peterson