2014-11-19 3 views
0
#include <iostream> 

struct Foo { static auto foo() -> int { return 123; } }; 

int main() { 
    std::cout << static_cast<Foo*>(nullptr)->foo() << std::endl; 
    return 0; 
} 

나는 이것이 표준에 의해 허용되지 않는다는 것을 알고 있습니다. 그러나 특정 컴파일러는 어떻습니까?GCC/Clang은 널 포인터를 통해 정적 멤버에 액세스 할 수 있습니까?

나는 GCC (G ++)와 Clang 만 신경 쓰고있다.

이 두 컴파일러가 컴파일러 기능/사양/확장 기능을 허용한다는 보장이 있습니까?

+0

이것은 "부작용"이 아닌 기능입니다. 아마도 디버그 모드에서 null 포인터에 대한 구조체 멤버에 대한 액세스 검사가있을 수 있습니다. 릴리스에서는 부하가 커질 수 있습니다. – i486

+0

null 포인터가 사용되지 않도록 * 정적 * 함수를 호출하고 있습니다. * 정적 * 함수가 아니면 null 포인터를 통해 메모리를 지정할 필요가 없기 때문에 여전히 작동 할 것입니다. 그러나 나는 그러한 행동이 아직 정의되지 않았다고 믿는다. – Galik

답변

0

이것이 효과가 있다는 것은 아무것도 아닙니다. 당신이 그것을 사용하기로 결정했다면, 당신이 그것을 사용하고있는 실제 아키텍처에서 실제로 작동하는지 확인하는 것은 당신에게 달려 있습니다. 그리고 모든 컴파일러에서 코드 생성, 널 포인터 사용 (및 그와 같은) 및 최적화를위한 디버그 트랩이 "대상 시스템에 따라 다름"을 반영하는 것이 중요합니다. 따라서 MIPS가 아닌 x86에서는 잘 작동 할 수 있습니다. . 또는 컴파일러의 버전 X + 0.0.1에서 작동하지 않을 수도 있습니다.

this은 어디에도 사용되지 않았기 때문에이 특정 예제가 모든 아키텍처에서 완벽하게 작동 할 것으로 기대됩니다.

무언가가 정의되지 않았기 때문에 충돌, 실패 또는 예상대로 정확하게 작동하지 않는다는 것을 의미하지는 않습니다. 그러나 컴파일러는 컴퓨터를 폭파하고 하드 드라이브를 포맷하는 등 컴파일러에서 원하는 모든 코드를 생성 할 수 있습니다.