저는 C ++ 초보자이고 Bjarne Stroustrup의 Programming : Principles and Practice Using C ++을 읽고 있습니다.
3.9.2 안전하지 않은 변환 섹션에서 저자는
이니셜 라이저가 정수 리터럴 인 경우 컴파일러는 실제 값을 확인하고 축소를 의미하지 않는 값을 허용 할 수 있습니다.
int char b1 {1000}; // error: narrowing (assuming 8-bit chars)
이 선언에 의아해합니다. 두 가지 유형 ( int
및 char
)을 사용합니다. 나는 전에 자바와 스위프트에서 그런 선언을 본 적이 없다 (내가 비교적 익숙한 두 언어). 오타 또는 유효한 C ++ 구문입니까?
답변
책의 실수입니다. 이것은 축소 변환이 없다고해도 유효한 C ++ 선언이 아닙니다.
그러나 Bjarne Stroustrup의 페이지 (4 번째 인쇄 및 이전) 에있는 정오표에는 언급되어 있지 않지만 이상합니다. 분명한 실수입니다. //error
소수의 사람들로 주석을 달았 기 때문에 선언 자체에서 실수를 알아 차릴 수 있다고 상상 합니다.
답변
책이 잘못되었습니다.
토큰 시퀀스 int char b1{1000};
가 의미 상 유효한 C ++가 아닙니다.
b1
둘 이상의 유형 으로 선언하려고하는데 말이 안됩니다.
답변
그건 잘못 됐어. C / C ++에서는 공용체를 사용하여 다중 유형 선언을 수행 할 수 있습니다. 예 :
union {
int i;
char c;
} var;
var.i = 42;
/* OR */
var.c = ‘c’;
저장소는 동일하므로 .c 및 .i는 동일한 값에 대한 유형별 핸들입니다.
답변
이것은 C / C ++ 구문에서 잘못되었습니다. union
s (@Alex 답변 참조) 외에도 std::variant
(type-safe union) 이라는 사용 가능한 유형 중 하나만 저장하는 C ++ 방법이 있습니다 .
#include <variant>
#include <string>
int main()
{
std::variant<int, float> v, w;
v = 12; // v contains int
int i = std::get<int>(v);
w = std::get<int>(v);
w = std::get<0>(v); // same effect as the previous line
w = v; // same effect as the previous line
// std::get<double>(v); // error: no double in [int, float]
// std::get<3>(v); // error: valid index values are 0 and 1
try {
std::get<float>(w); // w contains int, not float: will throw
}
catch (std::bad_variant_access&) {}
std::variant<std::string> v("abc"); // converting constructors work when unambiguous
v = "def"; // converting assignment also works when unambiguous
}