任何只包含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");
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一个例子来声明一个函数constexpr
会造成什么伤害吗?
一些初步想法:
即使没有充分的理由宣布一个函数,constexpr
我也无法想象该constexpr
关键字具有过渡角色:它在代码中的缺失不需要编译时评估将允许那些不实现编译时评估的编译器仍然编译该代码(但是在使用需要它们的代码上可靠地失败constexpr
).
但是我不明白:如果没有充分的理由不宣布函数constexpr
,为什么标准库中的每个函数都没有被声明constexpr
?(你不能说它还没有完成,因为还没有足够的时间去做,因为为所有人做这件事是明智的 - 与决定每一个功能是否成功相反constexpr
.) - - 我知道N2976
故意不要求cstrs用于许多标准库类型,例如容器,因为这对于可能的实现来说太有限了.让我们从参数中排除它们并且只是想知道:一旦标准库中的一个constexpr
类型实际上有一个cstr,为什么不是每个函数都在它上面声明constexpr
?
在大多数情况下,你也不能说你可能不想constexpr
仅仅因为你没有设想任何编译时使用而声明一个函数
:因为如果其他人退出.将使用您的代码,他们可能会看到您没有这样的用途.(当然,也可以用于类型特征类型和类似的东西.)
所以我想有一个很好的理由和一个故意不宣布功能的好例子constexpr
?
("每个函数"我总是指:满足存在要求的每个函数constexpr
,即被定义为单个return语句,只接受带有constexpr cstrs的类型的参数,并且只调用constexpr …
在C++ 0x中,可以创建一个constexpr std :: tuple,例如
#include <tuple>
constexpr int i = 10;
constexpr float f = 2.4f;
constexpr double d = -10.4;
constexpr std::tuple<int, float, double> tup(i, f, d);
Run Code Online (Sandbox Code Playgroud)
还可以在运行时查询std :: tuple,例如通过
int i2 = std::get<0>(tup);
Run Code Online (Sandbox Code Playgroud)
但是在编译时无法查询它,例如,
constexpr int i2 = std::get<0>(tup);
Run Code Online (Sandbox Code Playgroud)
将抛出编译错误(至少使用最新的g ++快照2011-02-19).
有没有其他方法在编译时查询constexpr std :: tuple?
如果没有,是否有一个概念上的原因,为什么不应该查询它?
(我知道避免使用std :: tuple,例如,通过使用boost :: mpl或boost :: fusion,但不知何故,如果不在新标准中使用元组类,这听起来是错误的......).
顺便问一下,有人知道为什么
constexpr std::tuple<int, float, double> tup(i, f, d);
Run Code Online (Sandbox Code Playgroud)
编译好,但是
constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4);
Run Code Online (Sandbox Code Playgroud)
不?
非常感谢提前! - 啦