任何只包含 return 语句的函数都可以被声明
,因此如果所有参数都是并且只有函数在其主体中被调用,constexpr
则允许在编译时进行评估。有什么理由不声明任何这样的功能吗?constexpr
constexpr
constexpr
例子:
constexpr int sum(int x, int y) { return x + y; }
constexpr i = 10;
static_assert(sum(i, 13) == 23, "sum correct");
任何人都可以提供一个声明函数constexpr
会造成任何伤害的例子吗?
一些初步的想法:
即使没有充分的理由声明一个函数constexpr
,我也无法想象该constexpr
关键字具有过渡作用:它在不需要编译时评估的代码中的缺失将允许不实现编译时评估的编译器仍然可以编译该代码(但在需要它们的代码上可靠地失败,因为使用明确表示constexpr
)。
但我不明白的是:如果没有充分的理由声明一个函数 not constexpr
,为什么不声明标准库中的每个函数constexpr
?(你不能说它还没有完成,因为还没有足够的时间去做,因为为所有人做这件事是不费吹灰之力的——这与决定是否做每一个功能相反constexpr
。)—— - 我知道N2976
故意不需要 cstrs 用于许多标准库类型(例如容器),因为这对于可能的实现来说太有限了。让我们将它们排除在参数之外,只是想知道:一旦标准库中的类型实际上有一个constexpr
cstr,为什么不是每个在它上运行的函数都声明constexpr
?
在大多数情况下,您也不能争辩说您可能不喜欢声明函数constexpr
,因为您没有设想任何编译时使用:因为如果其他人 evtl. 将使用您的代码,他们可能会看到您没有看到的这种用法。(但当然,对于类型特征类型和类似的东西是允许的。)
所以我想故意不声明一个函数一定有一个很好的理由和一个很好的例子constexpr
吗?
(对于“每个函数”,我始终是指:每个满足存在要求的函数constexpr
,即,被定义为单个 return 语句,只接受具有 constexpr cstrs 类型的参数并且只调用constexpr
函数。从 C++14 开始,更多在此类函数的主体中是允许的:例如,C++14 constexpr 函数可以使用局部变量和循环,因此可以声明更广泛的函数类constexpr
。)
问题为什么要std::forward
丢弃constexpr
-ness?是这个的一个特例。