将替换 '::' 为 '. ' 在 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';
}
a::b
和a.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.
}
无法借助 :: 区分我们要访问的成员,无法访问在父 class 中声明的具有相同名称的成员。
在 C++ 中,运算符 ::
用于访问名称空间或 class.
如果语言规范在那些情况下使用 .
而不是 ::
,就像在访问对象的实例 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';
}
a::b
和a.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.
}
无法借助 :: 区分我们要访问的成员,无法访问在父 class 中声明的具有相同名称的成员。