Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 连续调用constexpr函数时出现编译器错误_Gcc_Compiler Errors_Clang_C++17_Constexpr - Fatal编程技术网

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
    不再产生编译错误
  • 编辑(16.09.2019)
    显然,删除中介
    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.