在函数模板签名中忽略了成员typedef的访问说明符

use*_*756 2 c++

在下面的代码A::TypeprivateA.

class A {
    typedef int Type;
};

void func(int t, A::Type var)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

尝试编译时gcc会出现以下错误.

test.cpp: In function 'void func(int, A::Type)':
test.cpp:12:21: error: 'typedef int A::Type' is private within this context
 void func(int t, A::Type var)
                     ^~~~
test.cpp:2:17: note: declared private here
     typedef int Type;
                 ^~~~
Run Code Online (Sandbox Code Playgroud)

但是,如果我将第一个参数更改为模板参数,就像这样

template<typename T>
void func(T t, A::Type var)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

类似的访问说明符似乎被忽略,这将编译.

起初我怀疑它可能是一个错误gcc,但MSVC 2015表现出相同的行为.

出于某种原因,这种行为是否需要C++标准?如果是的话,这里的理由是什么?

小智 5

起初我怀疑它可能是gcc中的一个bug,

你怀疑是对的.GCC有很多关于模板中缺少可访问性检查的漏洞,但很明显它的开发人员会考虑那些需要修复的漏洞.您的示例可能包含在模板函数专门化中:不尊重访问说明符,即使它使用依赖的typedef,而您的依赖是非依赖的.

但MSVC 2015表现出相同的行为.

如果你说MSVC有影响一致性的错误,没有人会怀疑你.:)