태그 보관물: language-design

language-design

‘::’을 ‘로 바꾸십시오. ‘C ++로 모호성을 만드시겠습니까? ++에서 연산자 ::는

C ++에서 연산자 ::는 네임 스페이스 또는 클래스의 클래스, 함수 및 변수에 액세스하는 데 사용됩니다.

언어 명세를 사용하는 경우 .대신 ::인스턴스 변수 다음 객체 / 방법을 액세스 할 때와 같이 너무 이러한 경우에서와 함께 존재하지 않는 것을 원인 가능한 모호함 ::?

C ++에서 유형 이름 인 변수 이름을 허용하지 않기 때문에 발생할 수있는 경우를 생각할 수 없습니다.

설명 : 나는 왜 그것이 효과 ::가 있었을 지에 대해 왜 선택 되었는지 묻지 않고 .있습니까?



답변

C ++가 기존 C 코드와 대부분 호환되도록 (오브젝트 이름과 구조체 태그 사이의 이름 충돌을 허용 함) 시도하기 때문에 C ++은 클래스 이름과 객체 이름 사이의 이름 충돌을 허용합니다.

의미하는 것은:

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

coliru에서 라이브를 참조하십시오 .


답변

차이가 존재 a::b하고 a.b여기서 ::것을 의미 a는 네임 또는 유형 이름은 즉, 네임 스페이스로하는 방법을 사용 하였다. C ++이 비가 상 복수 상속을 지원하고 변수가 유형과 동일한 이름을 가질 수있는 경우 잘못된 객체를 참조 할 가능성이 줄어 듭니다. 템플릿 메타 프로그래밍에 필요합니다.

또 다른 예는 클래스 B와 관련하여 &B::foovs &B.foo입니다.


답변

@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.
}

Coliru Viewer에서 라이브

::의 도움으로 구별 할 가능성이 없는데, 우리가 접근하고자하는 멤버라면, 같은 이름으로 부모 클래스에 선언 된 멤버에 접근하는 것은 불가능합니다.


답변