gpt4 book ai didi

c++ - 将 decltype 与带有尾随返回类型语法的模板化成员函数一起使用时,gcc 中的编译器错误但不是 clang

转载 作者:太空宇宙 更新时间:2023-11-04 14:30:00 25 4
gpt4 key购买 nike

我有一个带有模板化成员函数的类,该函数采用可调用类型作为参数,并使用带有尾随返回类型语法的 decltype 从所提供函数的返回类型推导出返回类型。下面显示了一个最小的示例。

#include <iostream>
#include <vector>

class point {
public:
std::vector<double> val;
point(double in) : val({in}) {};
template<typename T> auto eval(const T& in) -> decltype(in(val[0]));
};

template<typename T>
auto point::eval(const T& in) -> decltype(in(val[0])){
return in(val[0]);
}

int main(int argc, char *argv[]){

point pt(2.0);
auto f = [](double x){return x*x;};

std::cout << pt.val[0] << std::endl;
std::cout << pt.eval(f) << std::endl;
}

此代码在 clang++ 和 g++-5 中按预期编译和工作,但在 g++-6 中出现以下错误。

> g++-6 main.cpp -o test -std=c++11 -Wall main.cpp:13:6: error:
> prototype for 'decltype
> (in(0->((point*)this)->point::val.std::vector<_Tp,
> _Alloc>::operator[]<double, std::allocator<double> >())) point::eval(const T&)' does not match any in class 'point' auto
> point::eval(const T& in) -> decltype(in(val[0])){
> ^~~~~ main.cpp:9:35: error: candidate is: template<class T> decltype (in(0->((point*)this)->point::val.std::vector<_Tp,
> _Alloc>::operator[]<double, std::allocator<double> >())) point::eval(const T&)
> template<typename T> auto eval(const T& in) -> decltype(in(val[0]));
> ^~~~ main.cpp:9:35: error: 'decltype (in(0->((point*)this)->point::val.std::vector<_Tp,
> _Alloc>::operator[]<double, std::allocator<double> >())) point::eval(const T&) [with T = main(int, char**)::<lambda(double)>;
> decltype (in(0->((point*)this)->point::val.std::vector<_Tp,
> _Alloc>::operator[]<double, std::allocator<double> >())) = double]', declared using local type 'const main(int, char**)::<lambda(double)>',
> is used but never defined [-fpermissive] main.cpp:9:35: warning:
> 'decltype (in(0->((point*)this)->point::val.std::vector<_Tp,
> _Alloc>::operator[]<double, std::allocator<double> >())) point::eval(const T&) [with T = main(int, char**)::<lambda(double)>]'
> used but never defined make: *** [all] Error 1

如果实现是内联的,即不会出现编译器错误,即

template<typename T> auto eval(const T& in) -> decltype(in(val[0])){
return in(val[0]);
}

此外,在 c++14 中通过将签名更改为

使用自动返回类型推导
template<typename T> auto eval(const T& in);

按预期工作。

这是 gcc 编译器错误还是 clang 错误地接受了上述代码?如果这些函数签名之间有什么区别呢?为什么内联实现会有所不同?

最佳答案

是的,可能是 gcc 错误。一个解决方法是做

template<typename T>
std::result_of<T(double)> point::eval(const T& in) {

关于c++ - 将 decltype 与带有尾随返回类型语法的模板化成员函数一起使用时,gcc 中的编译器错误但不是 clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41711674/

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