c++ - 方法的声明改变了符号的含义

标签 c++ token-name-resolution

对于以下代码:

struct foo {};

struct A
{
    typedef foo foo_type;

    void foo();
};

GCC 给出编译器错误:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive]
     void foo();
              ^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive]
 struct foo {};
        ^

但是 clang 接受它而没有编译器错误。谁是对的?

请注意,如果 typedef 被删除,或更改为 typedef::foo foo_type,gcc 和 clang 都会接受该代码。

最佳答案

gcc 是正确的,但 clang 不需要给出诊断(3.3.7):

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.

这是因为类作用域的工作方式。 void foo();foo 在类 A整个 范围内可见,因此声明void foo(); 将 typedef 中 foo 的含义从引用 struct foo 更改为函数的名称 foo .

关于c++ - 方法的声明改变了符号的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537023/

相关文章:

c++ - C++ 使用静态名称解析还是动态名称解析?

c++ - 全局命名空间中的保留名称

c++ - 删除数组中的多个元素

c++ - 我可以在不知道类型参数的情况下持有 shared_ptr 吗?

c++ - MFC 下拉菜单(包括屏幕截图)

c++ - 类模板、函数成员定义

python - TensorFlow 用户应该更喜欢 SavedModel 而不是 Checkpoint 或 GraphDef?

c++ - 从属名称解析和命名空间标准/标准库