gpt4 book ai didi

c++ - 具有未使用的引用参数的 constexpr 函数——gcc vs clang

转载 作者:可可西里 更新时间:2023-11-01 17:55:30 24 4
gpt4 key购买 nike

考虑以下代码:

template <int N, typename T> void f(T) { }

template <typename T>
constexpr int k(T&) { return 0; }

int main()
{
constexpr auto i = 1;
f<k(i)>([&i]
{
f<k(i)>(0);
});
}

clang++ (trunk) 编译它。 g++ (trunk) 失败并出现以下错误:

<source>: In lambda function:

<source>:11:19: error: no matching function for call to 'f<k<const int>((* & i))>(int)'
11 | f<k(i)>(0);
| ^

<source>:1:35: note: candidate: 'template<int N, class T> void f(T)'
1 | template <int N, typename T> void f(T) { }
| ^

<source>:1:35: note: template argument deduction/substitution failed:

<source>:11:19: error: '__closure' is not a constant expression
11 | f<k(i)>(0);
| ^

<source>:11:13: note: in template argument for type 'int'
11 | f<k(i)>(0);
| ~^~~

live example on godbolt.org


k(T&) 更改为 k(T) 即可解决问题。在我看来,问题与引用参数不是常量表达式,但它没有用作k的一部分有关。

这里哪个编译器是正确的?

最佳答案

GCC 在这里是正确的。

根据 [expr.const]/4 :

An expression e is a core constant expression unless the evaluation of e, following the rules of the abstract machine, would evaluate one of the following expressions:

  • ...
  • in a lambda-expression, a reference to [...] a variable with automatic storage duration defined outside that lambda-expression, where the reference would be an odr-use; ...
  • ...

k(i) odr-uses i 因此 k(i) 不是 lambda 表达式中的常量表达式,所以这段代码格式错误。

关于c++ - 具有未使用的引用参数的 constexpr 函数——gcc vs clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53978006/

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