仅仅因为一个函数(或构造函数)......
...并不意味着编译器将在转换期间评估constexpr函数.我一直在查看C++ 11 FDIS(N3242,可从http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/获取)来尝试确定两件事:
第5.19节第1段说明在翻译过程中可以评估常量表达式.据我所知,第5.19节的其余部分阐述了constexpr函数定义中有效的规则.
我理解我可以通过将constexpr函数的结果声明为constexpr来强制转换期间的constexpr评估.像这样:
// Declaration
constexpr double eulers_num() { return 2.718281828459045235360287471; }
// Forced evaluation during translation
constexpr double twoEulers = eulers_num() * 2.0;
static_assert(twoEulers > 5.0, "Yipes!");
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直无法找到FDIS中的段落:
twoEulers在翻译过程中要评估的力量我对发现特别感兴趣的是翻译期间的constexpr评估是否由以下因素触发:
如果可能的话,请在您的回复中引用我可以查找的FDIS部分或我可以在FDIS中搜索的关键短语.标准中的英语有点迟钝,所以我可能已经阅读了相关的段落并完全忽略了它们的含义或意图.
在C++ 11中,我声明了以下联合:
union U4 {
char c;
int i;
static int si;
};
Run Code Online (Sandbox Code Playgroud)
当我使用-std = C++ 11 -pedantic-错误编译此代码与G ++ 4.7.0时,得到以下的错误(用小的编辑):
错误:本地类'union U4'不应该有静态数据成员'int U4 :: si'[-fpermissive]
错误:'U4 :: si'可能不是静态的,因为它是union的成员
据我所知,FDIS(N3242)没有明确允许命名联合的静态数据成员.但我也没有看到FDIS 不允许指定工会的静态数据成员.FDIS确实反复提到"非静态数据成员"可以做什么[第9.5节第1段].相比之下,这表明该标准允许工会的静态数据成员.
对于union的静态数据成员,我没有任何用处.如果我需要它,我可能会对包含匿名联合的类产生足够接近的效果.我只是想了解标准的意图.
谢谢您的帮助.