2014-06-10 14 views
4

나는 구조체를 정의했습니다 :구조체 초기화/할당

struct float3 { 
float x; 
float y; 
float z; 

float3() : x(0), y(0), z(0) {} 
float3 (float a, float b, float c) : x(a), y(b), z(c) {} 
}; 

을하지만/초기화 회원에 값을 할당하는 다른 방법을 이해에 올 때 나는 문제가있다. 예 :

//Initialization 
float3 3Dvec = {1.0, 1.0, 1.0}; 
float3 3Dvec2 {1.0, 1.0, 1.0}; 
float3 3Dvec3 (1.0, 1.0, 1.0); 

//Assignment 
3Dvec = {2.0, 2.0, 2.0}; 
3Dvec = float3 (2.0, 2.0, 2.0); 

이러한 옵션은 모두 -std = C++ 11에서 작동합니다. 그러나 이전 컴파일러에서 -std = C++ 0x 중괄호 초기화/할당이 작동하지 않습니다. usign braces는 나쁜 습관입니까? 어느 옵션이 익숙해지면 좋을까요?

+0

당신은하지 어떤 중간 지점은 C++ (11) 또는 C++ 03 표준 중 하나에 코드를 작성해야합니다 (이 귀하의 오래된 컴파일러가 될 것 같습니다.) 당신이 여기에 보여주는 것은 좋은 C++ 11 연습처럼 보입니다. – juanchopanza

+0

@ juanchopanza 나는 여기에 동의하지 않을 것이다; C++ 11에서 지원하는 기능을 사용하여 컴파일러를 최대한 활용하십시오. 예를 들어 직장에서 gcc 4.8과 VS 2010을 사용하고 있습니다. VS2010이'constexpr'을 지원하지 않기 때문에 람다, 똑똑한 포인터,'auto'와'move semantics '에서 사임해야합니까? – Angew

+1

@Angew 반 웨이 포인트 컴파일러를 완전히 제어하고 있다면 괜찮습니다. 그렇지 않으면 이식성이 너무 좋지 않습니다. 그것이 내가 얻으려고했던 것입니다. – juanchopanza

답변

2

C++ 11에서는이 모든 것이 유효합니다. 적어도리스트 초기화와 관련하여 C++ 11 호환 컴파일러로 작업한다는 것을 알고 있다면, 중괄호 구문을 사용하는 것이 바람직하다고 말할 수 있습니다. 미래 지향적이고 모호하지 않습니다.

다음은 개별 문장의 상세한 분석이다 :

float3 vec3D = {1.0, 1.0, 1.0}; 

복사 목록 - 초기화. 엄밀히 말하면, 이것은 3 파라미터 생성자를 호출하여 임시 float3을 생성 한 다음 이동 생성자 (또는 이동 생성자가 사용 가능하지 않으면 복사 생성자)를 사용하여 vec3D을 초기화하고 마지막으로 임시를 삭제합니다.

실제로 임시 생성 및 이동/복사 작업은 손상되지 않은 컴파일러에 의해 생략되므로 비효율적이지 않습니다. 그러나은 이동/복사 생성자에 액세스 할 수 있어야합니다. 예를 들어 이동 불가능한 복사 불가능 클래스를 초기화 할 수 없습니다.

float3 vec3D2 {1.0, 1.0, 1.0}; 
float3 vec3D3 (1.0, 1.0, 1.0); 

이 두

는 직접 3 매개 변수 생성자를 호출하여 vec3D2을 초기화. 중괄호 중 하나가 최적의 구문이라고 말할 수 있습니다. 명확하지 않기 때문입니다. 이 특별한 경우에는 중요하지 않지만 때로는 괄호를 사용하면 (most) vexing parse 이 될 수 있습니다.
vec3D = {2.0, 2.0, 2.0}; 
vec3D = float3 (2.0, 2.0, 2.0); 

vec3D의 종류 float3 인만큼, 100 % 동일하다. 둘 다 임시 매개 변수를 사용하여 임시 float3 개체를 만들고 해당 개체를 이동 (또는 복사) 할당 연산자 vec3D에 전달한 다음 임시 개체를 소멸시킵니다.

미래의 증거이기 때문에 중괄호 하나가 더 낫다고 말하고 싶습니다. 클래스의 이름을 나중에 변경하면 중괄호는 그대로 작동하지만 괄호 이름은 이름이 필요합니다. 또한 vec3D 유형을 변경하면 중괄호는 vec3D 유형의 객체를 생성하지만 두 번째 객체는 float3 객체에서 계속 생성하고 할당합니다. 일반적으로 말할 수는 없지만 이전 행동이 일반적으로 선호된다고 말하고 싶습니다.


1 그 예는 다음과 같습니다

float3 x(float3()); // a function 
//vs. 
float3 y{float3{}}; // a variable