有没有理由不在C ++ 11之后隐式标记所有函数contexpr
?我认为“Caedite eos!Novit enim Dominus qui sunt eius”的原则可以在这里工作,因为如果:
template< typename T >
constexpr
T f(T t) { return t; }
int main(int argc, char *argv[])
{
f(1);
f(argc);
return 0;
}
f(argc)
自动识别为constexpr
,而不是f(1)
。一方面,编译器可以自然地推断出constexpr
说明符本身对函数的适用性,通常可以是constexpr
,另一方面它可以确保函数永远不会是constexpr
它们与the rules for constexpr
functions不匹配。
STL 也存在很多问题。比如说,关于非constexpr
operator []
非const
std::array
在常量表达式中或关于非constexpr
std::swap
,这会阻止使用std::swap
在常量表达式中。
为什么没有默认情况下为所有函数(甚至是语句,表达式和子表达式)启用隐式constexpr
说明符这样的语言功能?有性能原因或其他原因吗?