내가 컴파일하고 맹목적으로 좋아하는 당신은 C로 할 수있는 유연한 배열 구성원 만들려고, 다음과 같은 C++ 코드를 실행 :C++ 구조체 배열 구성원
이#include <iostream>
template <typename T>
struct Vector {
int length;
T ts[];
};
Vector<int> ts = {
3,
{10, 10, 10},
};
int main() {
std::cout << sizeof(ts) << std::endl;
std::cout << ts.data[1] << std::endl;
return 0;
}
코드는 컴파일을하고 잘 실행되고 C가 동일한 환경에서 출력하는 것과 동일한 결과를 제공합니다 (4와 10을 출력 함).
이제 this answer from 2010에 따르면 유효한 내용이 아니어야합니다. C++. 또한 this wikipedia article에 따르면 "C++에는 유연한 배열 구성원이 없습니다".
제 질문은 위의 코드에서 특히 "T ts[];
"이라는 줄에 실제로 어떤 C++ 기능을 사용하고 있습니까? 이 코드는 실제로 내가 일반적으로 생각하는대로 동작합니까, 아니면 정의되지 않은 동작입니까?
그냥 비표준 확장 프로그램입니다. 언어 명세 자체에는 gcc의 구현이 없지만 gcc의 구현은 그렇게합니다. –
컴파일러 확장. 어떤 도구 체인을 사용하고 있습니까? – user4581301
비정상적인 C++ 프로그램에 대한 동작이 정의되었는지 여부를 판단 할 수 있는지 확실하지 않습니다. 표준에 따라 컴파일해서는 안되며, 일부 컴파일러 확장의 경우에는 더 이상 표준에 의존 할 수 없습니다. – Slava