【问题标题】:How to understand "abstract-declarator containing an ellipsis shall only be used in a parameter-declaration"如何理解“包含省略号的抽象声明符只能用于参数声明”
【发布时间】:2020-05-12 06:56:51
【问题描述】:

考虑以下引用,它说:
[dcl.fct]/16

包含省略号的 declarator-id 或 abstract-declarator 只能在参数声明中使用。[...]

我同意包含省略号的declarator-id只能在参数声明中使用,因为我们不能在任何地方使用...id-expression之类的东西,它只能出现在参数中-declaration,所以它是 100% 清楚的。但是,关于包含省略号的 abstract-declarator 只能在参数声明中使用,请考虑以下代码:

#include <iostream>
#include <tuple>
template<typename...T>
void func(T...){
  std::tuple<T...> tup;  //#1
}

[dcl.name]

类型 ID:

type-specifier-seq abstract-declarator(opt)

#1 怎么样,不是参数声明,但是,包含省略号的抽象声明符在 type-id 中使用。所以,我对 的理解是>abstract-declarator错了?

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

    省略号不是type-id 的一部分,而是template-argument-list 的一部分。

    如果我们从[temp.names]应用以下语法

    简单模板 ID: 模板名称 opt > 模板名称: 标识符 模板参数列表: 模板参数 ...opt [...] 模板参数: 类型标识 [...]

    以你的例子,我们得到:

       std::tuple<T...> tup;
    //      tuple<T...>       simple-template-id
    //      tuple             template-name
    //            T...        template-argument-list
    //            T           template-argument, type-id
    

    那么,[temp.arg]/9

    template-argument 后跟一个省略号是一个包扩展。

    适用,这是我们所期望的。

    【讨论】:

    • 你的意思是这里出现的省略号不是抽象声明符的一部分,而是跟随模板参数。那么有抽象声明符的情况吗?
    • @jackX 没错。在您的示例中,void func(T...) 中的省略号是parameter-declaration 中的abstract-declarator
    • 我不明白元组中的T...和parameter-list-clause中的T...的区别,我认为它们都是type-id。或者换句话说,模板参数在元组中也是类型,对吗?比如你答案中的语法,template-argument: type-idT 作为类型名称,... 作为抽象声明符。这是我的理解。有没有可以区分它们的引用?
    • 是的,但是,我认为void func(T...) 中的T 不是模板名称,因为simple-template-id:template-name&lt;template-argument-list(opt)&gt; 和[[temp.param#3]]( timsong-cpp.github.io/cppwp/n4659/temp.param#3),它说标识符不跟随省略号的类型参数将其标识符定义为typedef-name,所以T这里是type-name
    • 是的,但是模板名称后面可以跟&lt;something&gt;,这里T 只是某种类型,它不是模板名称,我认为。而且[temp.param#3] 说它是一个typedef-name,这意味着它必须表示一个类型,相比之下,一个模板名不是一个类型。
    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 2016-10-23
    • 2015-01-11
    • 2017-12-22
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多