"constexpr"函数在另一个函数中的前向声明--编译器错误
Forward-declaration of a `constexpr` function inside another function -- Compiler bug?
在为我偶然发现的这个问题生成MCVE时,我发现编译器之间存在以下差异:
考虑以下代码:
// constexpr int f(); // 1
constexpr int g() {
constexpr int f(); // 2
return f();
}
constexpr int f() {
return 42;
}
int main() {
constexpr int i = g();
return i;
}
此代码在Clang 3.8.0上编译,但在GCC 6.1.0上失败,错误代码为:
error: 'constexpr int f()' used before its definition
注释掉// 2
和取消注释// 1
对这两个编译器都有效。
有趣的是,将f
的定义替换为// 1
会编译,但会在// 2
:处触发警告
warning: inline function 'constexpr int f()' used but never defined
哪个编译器是对的?
用inline
函数替换constexpr
函数保留了完全相同的问题(全局声明1可以,但函数范围声明2不行。)由于constexpr
暗示inline
,这似乎是原因。
在这种情况下,对于声明2,GCC会抱怨:warning: 'inline' specifier invalid for function 'f' declared out of global scope
以及CCD_ 11。无法链接("undefined reference to 'f()'
")。
因此,它看起来放弃了内联,放入了一个调用,但不需要为f()
发出代码,因为所有的使用都是内联的(?),所以链接失败了。
Clang抱怨道:error: inline declaration of 'f' not allowed in block scope
由于constexpr
意味着inline
,因此块范围中不允许内联声明的规则似乎也应该适用于constexpr
,因此GCC是正确的。但标准似乎并没有这么说。在我审查的草案中,关于inline
的规则在§7.1.2[dcl.fct.spec]第3部分:"内联说明符不应出现在块作用域函数声明上",但关于constexpr
没有类似的内容。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"