Gcc 连续调用constexpr函数时出现编译器错误
我有下面的例子:Gcc 连续调用constexpr函数时出现编译器错误,gcc,compiler-errors,clang,c++17,constexpr,Gcc,Compiler Errors,Clang,C++17,Constexpr,我有下面的例子: #include <cstdint> template<typename T> struct a_size { constexpr static std::size_t size() { return sizeof(T); } }; template<typename T> constexpr std::size_t foo(T const& t) { constexpr auto result = a_size
#include <cstdint>
template<typename T>
struct a_size {
constexpr static std::size_t size() { return sizeof(T); }
};
template<typename T>
constexpr std::size_t foo(T const& t) {
constexpr auto result = a_size<decltype(t)>::size();
return result;
}
template<typename T>
constexpr std::size_t bar(T const& t) {
constexpr auto result = foo(t);
return result;
}
int main() {
constexpr auto r = bar('c');
return r;
}
我在godbolt.org
上观察到与clang8.0.0
和clangtrunk
类似的行为,但是,该示例在GCC
上运行,这两个9.2.0
和trunk
编译为
clang++-std=c++17 main.cc-o main.run
g++-std=c++17 main.cc-o main.run
constexpr
-essness不能在整个调用链中过渡地应用/使用(因为没有更好的词)?(我知道调用foo(t)
的结果出于某种原因没有标记constexpr
。问题是为什么。)GCC/G++
还是在Clang
中条(T const&)
中的引用(&
)可以解决问题,而clang
不再产生编译错误显然,删除中介
result
变量可以解决问题(正如David Ledger所建议的那样)。但这并不能回答其他问题。更不用说一些用例可能需要这样的中间变量。删除第16行临时结果似乎也可以解决您的问题。“奇怪!”戴维德勒:是的,我知道。但是(我的)用法的上下文与我在问题中提出的略有不同。虽然,我缩小了问题的范围,以生成与问题中显示的结果相同的结果(实际上是错误),因此我决定以我的方式提问。删除第16行临时结果似乎也可以解决您的问题。“奇怪!”戴维德勒:是的,我知道。但是(我的)用法的上下文与我在问题中提出的略有不同。尽管如此,我缩小了问题的范围,以产生与问题中提出的结果相同的结果(实际上是错误),所以我决定以我的方式提问。
main.cc:16:33: error: constexpr variable 'result' must be initialized by a constant expression
constexpr auto result = foo(t);
~~~~^~
main.cc:21:24: note: in instantiation of function template specialization 'bar<char>' requested here
constexpr auto r = bar('c');
^
1 error generated.