decltype(auto)变量可以使用cv限定符吗?

13

标准规定,如果占位符是decltype(auto)类型说明符,则T应该只是占位符。

decltype(auto)*x7d = &i;//错误,声明的类型不是普通的decltype(auto)

目前尚不清楚是否仍允许使用cv限定符。如果可以使用将是有意义的,但编译器对此存在分歧。下面的代码被g++接受,但被clang++拒绝,vc++似乎根本不支持decltype(auto)变量:

int main()
{
    const decltype(auto) sz_text{"test"};
}
1个回答

10
为了回答这个问题,我们需要引用前面的段落,该段指定了T是什么。在这种情况下,[dcl.type.auto.deduct]/2中提到(重点在于“我”):
一个包含占位类型的类型T和相应的初始化程序e,如下确定: 对于使用包含占位类型的类型声明的变量,T是变量的声明类型,而e是初始化程序。 如果初始化是直接列表初始化,则初始化程序必须是一个只包含单个赋值表达式的大括号初始化列表,并且e是赋值表达式。
在这种情况下,T是整个声明类型sz_text,包括cv限定符。而你引用的段落非常清楚,如果它包含decltype(auto)作为占位符,那么它必须是这样,没有更多的了。
所以这是一个GCC的bug。已经有人报告过了

是否存在一个开放的错误报告? - Vittorio Romeo
@VittorioRomeo - 我没有找到这个。虽然这并不意味着什么,因为我很少能够在没有帮助的情况下找到它们。 - StoryTeller - Unslander Monica
1
@VittorioRomeo - 这对我来说是一个罕见的机会,因为我很幸运。在这里。几乎一模一样。 - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接