【问题标题】:constexpr constructor with compile time validation带有编译时验证的 constexpr 构造函数
【发布时间】: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 啊,那我错了。

标签: c++ c++11 constexpr


【解决方案1】:

以下可能会有所帮助:

class A
{
public:
    constexpr A(int i) : i(i != 42 ? throw 42 : i) {}
private:
    int i;
};

int main(int argc, char *argv[])
{
    constexpr A a1(42);
    //constexpr A a2(41); // Compile error as expected.
    return 0;
}

【讨论】:

  • 很遗憾没有,我刚收到这个错误:expression '<throw-expression>' is not a constant-expression
  • @nyarlathotep108:哪个编译器/版本?
  • mingw48,Qt 5.2.0 for Windows 自带
  • 它适用于我的 g++ TDD 4.7.1 和 g++ TDD 4.8.1(也适用于 Windows)。你的似乎是 gcc 4.8.0 。无法提供更多帮助,抱歉。
  • 没关系,我认为这是我在 mingw48 中发现的第二个与 c++11 相关的错误...第一个是与 相关的。希望他们能解决
猜你喜欢
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2018-10-04
  • 2021-11-25
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多