【发布时间】:2012-03-14 05:07:19
【问题描述】:
我想定义一个类,它的实例可以从整数常量零构造、隐式构造或赋值,但不能从任何其他数值常量,也不能从整数类型的变量(即使它的值恰好是运行时为零)。它还应该可以从同一类的其他实例复制构造。只要 g++ 4.6 和 MSVC 2010 都支持(在适当的模式下)C++11 功能,就可以使用它们。
具体来说,给定
class X { /* ... */ };
void fn(X);
这些都应该编译:
X a(0);
X b = 0;
X c; c = 0;
X d = a;
X e; e = a;
fn(0);
但这些不应该:
X f(1);
X g = 1;
X h; h = 1;
fn(1);
int ii = 23;
X a(ii);
X j = ii;
X k; k = ii;
fn(ii);
我试过了,但没用:
class X {
public:
X() {}
constexpr X(int v) { static_assert(v == 0, "must be initialized from zero"); }
};
⟶
test.cc: In constructor ‘constexpr X::X(int)’:
test.cc:3:29: error: non-constant condition for static assertion
test.cc:3:29: error: ‘v’ is not a constant expression
【问题讨论】:
-
好的。用例是什么?
-
为什么不使用默认构造函数呢?
-
这个用例冗长而复杂,并不是那么相关。可以说 X 与数字有一些相似之处(整个类定义了一些清单常量和一些算术运算符),但与数字文字的唯一重叠点是零。默认构造很好,但在某些情况下(例如传递
fn的参数)写零更自然。 -
我不明白...删除默认构造函数,如果不为0则抛出异常。为什么不起作用?
-
@0A0D 我希望错误初始化是编译错误,而不是运行时错误。
标签: c++