将 ' :: ' 替换为 ' 。' 在 C++ 中产生歧义?

use*_*676 95 c++ language-design

在 C++ 中,运算符::用于访问命名空间或类中的类、函数和变量。

如果在访问对象的实例变量/方法时使用的语言规范.而不是::在那些情况下太像,那么这是否会导致可能不存在的歧义::

鉴于 C++ 不允许变量名也是类型名,我想不出可能发生的情况。

澄清:我不是问为什么::被选中.,只是如果它也可以工作?

Kit*_*it. 125

由于试图使 C++ 与现有的 C 代码大部分兼容(允许对象名称和结构标记之间的名称冲突),C++ 允许类名称和对象名称之间的名称冲突。

意思就是:

struct data {
    static int member;
};

struct data2 {
    int member;
};

void f(data2& data) {
    data.member = data::member;
}
Run Code Online (Sandbox Code Playgroud)

是合法代码。

  • 所以标题中问题的答案是“是的,会的”,不是吗? (11认同)
  • @EnricoMariaDeAngelis,事情没那么简单。如果 C++ 是作为一种全新的语言开发的,就像 Java 或 C# 一样,那么歧义性可能是可以避免的。但 C++ 是作为“带有类的 C”而开发的,这就是为什么它不是。“是的,它_会_”是一个正确的答案,但针对的是另一个问题。 (2认同)

Ded*_*tor 38

两者都有效但引用不同对象的示例:

#include <iostream>

struct A {
    int i;
};

struct B {
    int i;
    A B;
};

int main() {
    B x {0, 1};
    std::cout << x.B.i << '\n';
    std::cout << x.B::i << '\n';
}
Run Code Online (Sandbox Code Playgroud)

请参阅coliru 直播


Swi*_*Pie 7

a::ba.bwhere之间有区别,::意味着a用作命名空间,这意味着它是命名空间或类型名称。如果 C++ 支持非虚拟复数继承,并且变量可以与类型具有相同的名称,这将消除引用错误对象的机会。这是模板元编程所必需的。

另一个例子是B 类上下文中的&B::foovs。&B.foo