gpt4 book ai didi

c++ - decltype(auto) 应该为自动类型推导的参数推导什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:28 25 4
gpt4 key购买 nike

我认为这两个函数应该具有相同的返回类型:

template<class T>
decltype(auto) f(T&& a){return a;}
decltype(auto) g(auto&& a){return a;}

尽管如此,使用 gcc7,这些函数验证:

int i;
static_assert(std::is_same< decltype(f(i)), int& >::value);
static_assert(std::is_same< decltype(g(i)), int >::value);

为什么g和f的返回类型不同?

最佳答案

定义

decltype(auto) g(auto&& a){return a;}

不是标准 C++。它可能是即将推出的 Concepts Lite 功能的一部分。 g++ 提供语法作为扩展(即使没有-fconcepts)

使用 -Wpedantic 编译实际上会产生警告:

warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
decltype(auto) g(auto&& a){return a;}
^~~~

由于行为尚未标准化,因此不清楚您的 static_assert 是否应该是真实的 - 直觉上我同意 decltype(g(i)) 应该是int& 不过。这可能只是 g++ 如何实现非成员函数 auto 参数的“缺陷”。


与您尝试做的事情最接近标准的是lambda 表达式:

auto z = [](auto&& a) -> decltype(auto) { return a; };

z 的情况下,static_assert 按预期工作:

static_assert(std::is_same< decltype(z(i)), int&  >::value);

关于c++ - decltype(auto) 应该为自动类型推导的参数推导什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43515229/

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