gpt4 book ai didi

c++ - constexpr 构造函数是否允许 return 语句?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:02 26 4
gpt4 key购买 nike

this page 中所述, constexpr 构造函数主体的复合语句,如果不删除也不默认,必须满足 constexpr 函数主体的约束,即它可能包含任何声明,除了:

  • asm 声明
  • goto 语句
  • try- block
  • 非文字类型或静态或线程存储持续时间或未执行初始化的变量的定义

标准似乎没有限制可能出现的 return 语句的数量,而在 C++11 中,只允许出现一个。

现在,考虑以下代码:

class Thing
{
public:
// Shouldn't this constructor be fine under both C++11 and C++14?
constexpr Thing ( )
{
return;
}
};

int main ( )
{
Thing a_nice_thing;
}

Clang(3.5 with -std=c++14)可以很好地编译它,但是 GCC(4.9.1 with -std=c++14)不能, 提示:

constexpr constructor does not have empty body

但是,如果改变了:

class Thing
{
public:
// This constructor is fine under both C++11 and C++14
constexpr Thing ( )
{
static_assert( __cplusplus > 1 , "static_assert isn't the right mechanism to test this, since it wasn't available at earlier versions of the language" );
}
};

int main ( )
{
Thing a_nice_thing;
}

然后它在两个编译器下都能正常编译。

既然 GCC 提示构造函数的主体不是空的,那么它不应该在后面的情况下提示吗?这种行为是 GCC 中的错误吗? constexpr 构造函数是否允许使用 return 语句?

注意:单个 return 语句是否真的有值(value)不是这个问题的范围,尽管很有趣并且也许值得另一个问题。出于样式原因,我在主体为空的构造函数上放置了单个 return 语句。

最佳答案

GCC 当前 doesn't support C++14 版本的 constexpr,因此即使使用 -std=c++14,您仍然可以获得 C++11 的 constexpr

C++11 对 constexpr 构造函数体的限制是 (§7.1.5 [dcl.constexpr]/p4):

the compound-statement of its function-body shall contain only

  • null statements,
  • static_assert-declarations
  • typedef declarations and alias-declarations that do not define classes or enumerations,
  • using-declarations,
  • and using-directives;

(还有很多其他限制;我只引用与问题相关的内容。)

return 语句在 C++11 的 constexpr 构造函数中是不允许的,而 static_assert 是。

关于c++ - constexpr 构造函数是否允许 return 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com