nullopt
대신 nullptr
을 사용할 수없는 이유는 무엇입니까? 그리고 왜 {}
은 nullopt
처럼 번역됩니까?nullptr, {} 및 nullopt의 차이점
-1
A
답변
5
optional<T>
가T
포인터의 종류 아니라, 그것은 입니다 중 하나T
또는 아무것도없는 값이다. 포인터와 참조에서 할 수있는 것처럼 "매달려있는optional
"또는 다른 종류의 "유효하지 않은"값을 가질 수 없습니다.nullptr
은 모든 포인터 유형의 값으로 변환 할 수있는 객체입니다.nullopt
은optional
유형의 값으로 변환 할 수있는 객체입니다.{}
T
는이 컨텍스트에 어떤 유형의 "타입T
의 기본 구성 객체를"수단 식 (콘텍스트의 값을 예상)한다.T
이 포인터 유형이면nullptr
과 같습니다.T
이optional
유형이면nullopt
과 같습니다.T
이 산술 유형이면0
과 같습니다.T
이 표준 컨테이너 유형 중 하나 인 경우 해당 유형의 다른 빈 컨테이너와 동일하게 비교됩니다.
3
이유는
nullptr
대신nullopt
사용할 수 없습니다?
그들은 다른 것들이기 때문입니다. 그들은 뭔가 다른 것을 의미하고, 그들은 다른 무언가에 사용됩니다.
그것은 이미 수행 std::optional
nullptr
때문에 함께 사용하기위한 별개의 nullopt
값을 가질 필요가 뭔가 :
std::optional<int*> o;
o = nullptr;
assert(o.has_value());
o = std::nullopt;
assert(!o.has_value());
왜
{}
이nullopt
처럼 변환?
(다른 유형 {}
를 사용하지 않을 경우 std:optional
만 사실이다 NB.)
그것은 않는이 o = {}
말을하고 똑바로 살아라 ™ 등 할 일이 할 수있는 편리하기 때문에 std::optional
의 사양이 작동하도록 작성되었습니다.
당신은'std :: optional'를 가질 수 있습니다. –
Jarod42
존재하지 않는 선택적인 포인터는 존재하고'nullptr '인 포인터와 다릅니다. 디폴트로 초기화 된'optional'은 객체를 가져서는 안됩니다 (디폴트가 아닌 유형의 경우에는 사용할 수 없습니다). 그것은 나에게 명백한 것처럼 보인다. 또한'std :: optional'이 받아 들여지는 논문을 읽음으로써 질문에 대한 답을 얻을 수 있을지 궁금합니다. –
'nullptr' = "포인터가 있지만 아무 것도 가리 키지 않습니다"; 'nullopt' : "아무것도 없다". – molbdnilo