2011-12-24 53 views
44

如何将一个适当做constexpr函数内的static_assert?例如:C++ 11 - constexpr函数中的static_assert?

constexpr int do_something(int x) 
{ 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

这不是有效的C++代码11,因为constexpr函数只能包含一个return语句。我认为标准没有例外,尽管GCC 4.7不允许我编译这些代码。

回答

52

这是无效的C++ 11代码,因为一个constexpr函数只能包含一个return语句。

这是不正确。 static_assertconstexpr功能都很好。什么是罚款常数表达式中使用函数的参数,就像你这样做。

你可以抛出,如果x <= 0。调用在需要常量表达式会失败,上下文的函数编译

constexpr int do_something(int x) { 
    return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0")); 
} 
+9

酷,我不知道'throw's在被称为在constexpr上下文中的'constexpr'功能会导致编译失败! – Xeo 2011-12-24 19:36:13

+16

@Xeo做任何事情* *在另一侧的非constexpressy:将做的工作。 :) – 2011-12-24 19:44:15

+0

对'static_assert'的很好补充我必须说。 :) – Xeo 2011-12-24 19:46:16

20

这工作是有效的C++ 11的代码,因为模板参数只有编译时间:

template <int x> 
constexpr int do_something() { 
    static_assert(x > 0, "x must be > 0"); 
    return x + 5; 
} 

我面临着与你在C++中使用常量表达式相同的问题。目前几乎没有关于constexprs的明确文件。请注意,gcc的问题跟踪器中存在一些已知的错误,但您的问题似乎并不是一个错误。

请注意,如果你声明里面的类constexpr功能,您将无法使用它们的类中。这似乎也不是一个错误。

编辑:这是根据标准允许的:7.1.3状态

...或复合语句只包含

  • 空语句,
  • static_assert -declarations
  • typedef声明和别名声明
    定义类或枚举,
  • 使用申述,
  • using指令,
  • 和只有一个return语句
+1

编号constexpr只能是单个返回语句。 – 2012-12-14 22:08:01

+1

真的吗?这个对我有用。我究竟做错了什么? http://ideone.com/3GOk7Q – cppist 2012-12-25 16:02:33

+1

我读了标准。你是对的,这很好。我编辑了你的答案补充说。 – 2012-12-25 17:27:00