gpt4 book ai didi

c++ - 在默认模板参数中调用 constexpr

转载 作者:IT老高 更新时间:2023-10-28 23:16:41 27 4
gpt4 key购买 nike

在 C++11 中,我使用 constexpr 函数作为模板参数的默认值 - 它看起来像这样:

template <int value>
struct bar
{
static constexpr int get()
{
return value;
}
};

template <typename A, int value = A::get()>
struct foo
{
};

int main()
{
typedef foo<bar<0>> type;

return 0;
}

G++ 4.5 和 4.7 编译这个,但 Clang++ 3.1 没有。来自 clang 的错误信息是:

clang_test.cpp:10:35: error: non-type template argument is not a constant expression
template <typename A, int value = A::get()>
^~~~~~~~
clang_test.cpp:17:19: note: while checking a default template argument used here
typedef foo<bar<3>> type;
~~~~~~~~~^~
clang_test.cpp:10:35: note: undefined function 'get' cannot be used in a constant expression
template <typename A, int value = A::get()>
^
clang_test.cpp:4:23: note: declared here
static constexpr int get()
^
1 error generated.

哪个是正确的?

最佳答案

LLVM IRC channel 的 Richard Smith(zygoloid)就这个问题与我进行了简短的交谈,这是您的答案

<litb> hello folks
<litb> zygoloid, what should happen in this case?
<litb> http://stackoverflow.com/questions/10721130/calling-constexpr-in-default-template-argument
<litb> it seems to be clang's behavior is surprising
<litb> zygoloid, i cannot apply the "point of instantiation" rule to constexpr
function templates. if i call such a function template, the called definition's
POI often is *after* the specialization reference, which means at the point of
the call, the constexpr function template specialization is "undefined".
<zygoloid> it's a horrible mess. Clang does not do what the standard intends, but
as you note, the actual spec is gloriously unclear
<d0k> :(
<zygoloid> we should instantiate bar<3>::get(), because it is odr-used, but we
don't, because we incorrectly believe it's used in an unevaluated context
<zygoloid> conversely, the point of instantiation is too late :/
<zygoloid> PR11851

因此,有时,Clang 实例化调用的函数模板或类模板的成员函数,但它们的实例化为时已晚,调用无法看到,而在其他情况下,它甚至不实例化它们,因为它认为它永远不需要他们(未评估的上下文)。

关于c++ - 在默认模板参数中调用 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10721130/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com