将替换 '::' 为 '. ' 在 C++ 中制造歧义?

Would replacing ' :: ' with ' . ' create ambiguities in C++?

在 C++ 中,运算符 :: 用于访问名称空间或 class.

中的 classes、函数和变量

如果语言规范在那些情况下使用 . 而不是 ::,就像在访问对象的实例 variables/methods 时一样,那么会不会导致可能出现的歧义,而这些歧义是不存在的::?

鉴于 C++ 不允许变量名同时也是类型名,我想不出会发生这种情况的情况。

澄清:我不是在问为什么选择 :: 而不是 .,只是如果它也能奏效?

由于试图使 C++ 与现有的 C 代码基本兼容(允许对象名称和结构标签之间的名称冲突),C++ 允许 class 名称和对象名称之间的名称冲突。

这意味着:

struct data {
    static int member;
};

struct data2 {
    int member;
};

void f(data2& data) {
    data.member = data::member;
}

是合法代码。

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

#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';
}

live on coliru

a::ba.b有区别,::表示a用作命名空间,即命名空间或类型名。如果 C++ 支持非虚拟复数继承,并且变量可以与类型同名,这就消除了引用错误对象的可能性。模板元编程所必需的。

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

让我们扩展@Deduplicator 示例:

#include <iostream>

struct A {
    int i;
};

struct B : public A {
    int i;
    A A;
};

int main() {
    B x {1, 2};
    std::cout << x.i << '\n';
    std::cout << x.B::i << '\n';  // The same as the line above.
    std::cout << x.A.i << '\n';
    std::cout << x.A::i << '\n';  // Not the same as the line above.
}

Live on Coliru Viewer

无法借助 :: 区分我们要访问的成员,无法访问在父 class 中声明的具有相同名称的成员。