相关疑难解决方法(0)

decltype(auto)有哪些用途?

在c ++ 14 decltype(auto)中引入了成语.

通常,它的用途是允许auto声明使用decltype给定表达式的规则.

搜索成语的"好"用法示例我只能想到以下内容(由Scott Meyers提供),即函数的返回类型推导:

template<typename ContainerType, typename IndexType>                // C++14
decltype(auto) grab(ContainerType&& container, IndexType&& index)
{
  authenticateUser();
  return std::forward<ContainerType>(container)[std::forward<IndexType>(index)];
}
Run Code Online (Sandbox Code Playgroud)

这个新语言功能有用吗?

c++ decltype auto return-type-deduction c++14

133
推荐指数
2
解决办法
5万
查看次数

在decltype(auto)的情况下,lambda是否有特殊规则?

如果我正确理解了这个答案并引用了标准部分[dcl.type.auto.deduct-5],那么代码如下:

decltype(auto) a = e;
Run Code Online (Sandbox Code Playgroud)

总是相当于

decltype( e  ) a = e;
Run Code Online (Sandbox Code Playgroud)

但是现在问题出现了,而不是e我把lambda表达式放到decltype(auto):

decltype(auto) lambda = [](){};
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这在gccclang中成功编译.我所经历的冲击的原因在于标准,其中特别指出lambda不应出现在未评估的操作数中[expr.prim.lambda#2](强调我的):

lambda-expression是一个prvalue,其结果对象称为闭包对象.lambda表达式不应出现在未评估的操作数,模板参数,别名声明,typedef声明或函数体和默认参数之外的函数或函数模板的声明中.

但正如我所提到的,这个例子相当于:

decltype([](){}) lambda = [](){};
Run Code Online (Sandbox Code Playgroud)

明确写出的上述代码显然是不正确的.当然,我们可以假设[](){}里面的语句decltype是一种引用,实际上并不是像结构化绑定那样的引用,但是标准中有一条特殊的规则,我错过了覆盖lambda的初始化decltype(auto)

c++ lambda decltype language-lawyer c++14

11
推荐指数
1
解决办法
421
查看次数