为什么const-qualify指针的参数包是错误的?

Dan*_*nra 16 c++ const variadic-functions c++11

当实现一个接受指针参数包的函数时Ts...,为什么我const不能对指针进行限定,正如常规参数一样?

我在最新的GCC和Clang上遇到了不匹配的签名错误,我不明白为什么,因为指针const只是一个实现细节(因此它对于常规参数是合法的).

template<typename... Ts>
class C
{
    void f(int*);
    void g(Ts*...);
};

template<typename... Ts>
void C<Ts...>::f(int* const) {} // Legal

template<typename... Ts>
void C<Ts...>::g(Ts* const...) {} // Compiler error
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

prog.cc:12:16: error: out-of-line definition of 'g' does not match any declaration in 'C<Ts...>'
void C<Ts...>::g(Ts* const...) {}
               ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

您还可以在此处查看代码和错误.

Sto*_*ica 13

我将把它归结为一对编译器错误(经过测试的Clang和GCC).我知道这是一个大胆的断言,但[dcl.fct]/5说,强调我的:

单个名称可用于单个范围内的多个不同功能; 这是函数重载.函数的所有声明都应在return类型和parameter-type-list中完全一致.使用以下规则确定函数的类型.每个参数的类型(包括函数参数包)由其自己的decl-specifier-seq和声明符确定.在确定每个参数的类型之后,将"T数组"或函数类型T的任何参数调整为"指向T的指针".生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv限定符. 生成的已转换参数类型列表以及省略号或函数参数包的存在与否是函数的parameter-type-list.[注意:此转换不会影响参数的类型.例如,int()(const int p,decltype(p))和int()(int,const int)是相同的类型. - 结束说明]

其中非常清楚地告诉我,两个成员(f g)的声明都课外定义相匹配,使您的程序有效.所以Clang和GCC应该接受它.

  • 这很奇怪:clang接受`g`的两个定义:https://wandbox.org/permlink/y6GAGVXg00jrDnn4 (3认同)
  • @YSC - 似乎 Clang 在函数签名中编码的数据比它应该的多。 (2认同)