【发布时间】:2014-02-04 16:21:05
【问题描述】:
我想建立一个带有 constexpr-ness 选项的类。而且,当然,我想利用编译时错误检查。
当给定参数不是常量表达式时,每个constexpr 函数(包括构造函数)也必须在运行时工作。这应该就是为什么每次在 constexpr 函数中对函数参数使用 static_assert 时它无法编译的原因。
这么说,我已经读过可以使用异常抛出机制,因为当函数在常量表达式上调用时,可以在编译时评估这些异常。如果这样的话,对于函数来说问题就解决了。
但是构造函数的问题仍然没有解决,因为constexpr构造函数似乎必须没有主体......所以看起来我不能使用从那里抛出异常!
有什么想法吗?
【问题讨论】:
-
您可以使用逗号运算符。例如:
widget::widget() : value_((throw some_exception(), 0)) { }。请注意,您不必使用异常,它可以是对非constexpr函数的调用,也可以是std::abort。 -
...或
assert也可以:widget::widget(T t) : value_((assert(...), t)) {} -
@Casey
assert是一个可以扩展为 if 语句的宏;移动到另一个编译器时要小心编译错误。 -
@SebastianRedl Per C99(好吧,N1256 很接近)§7.2.1.1/2 “
assert宏将诊断测试放入程序中;它扩展为void表达式。”跨度> -
@Casey 啊,那我错了。