请参阅更新以获得更好的问题示例。原始代码有各种各样的问题,使图片混乱:
这个问题 为什么我可以在constexpr函数中调用非constexpr函数? 提出以下代码
#include <stdio.h>
constexpr int f()
{
return printf("a side effect!\n");
}
int main()
{
char a[f()];
printf("%zd\n", sizeof a);
}
我回答的是 病态的 但 gcc 4.8.2
允许它(看到它)。
但是,如果我们使用 -fno-builtin
旗 gcc
产生错误(看到它):
error: call to non-constexpr function 'int printf(const char*, ...)'
return printf("a side effect!\n");
^
所以 seems
那 gcc
正在考虑其内置版本 printf
成为一个不变的表达。 gcc
文件内置在这里 但是没有记录这种情况,其中非constexpr函数的内置可以被认为是常量表达式。
如果确实如此:
- 是否允许编译器执行此操作?
- 如果他们被允许,他们不必记录它是否符合要求?
- 这可以被视为一个扩展,如果是这样,似乎这需要一个警告作为 C ++草案标准 部分
1.4
实施合规性 段 8 说(强调我的):
符合条件的实现可能具有扩展(包括其他库函数),前提是它们不会改变任何格式良好的程序的行为。 需要实现来诊断使用根据本国际标准格式不正确的扩展的程序。但是,这样做后,他们可以编译和执行这些程序。
更新
正如凯西所指出的那样,原始问题中有一些事情会使它成为一个糟糕的例子。一个简单的例子就是使用 性病::战俘 这不是constexpr功能:
#include <cmath>
#include <cstdio>
constexpr double f()
{
return std::pow( 2.0, 2.0 ) ;
}
int main()
{
constexpr double x = f() ;
printf( "%f\n", x ) ;
}
编译和构建时没有警告或错误(看到它)但添加 -fno-builtin
使它产生错误(看到它)。注意: 为什么数学函数不是c ++ 11中的constexpr:
error: call to non-constexpr function 'double pow(double, double)'
return std::pow( 2.0, 2.0 ) ;
^