2017-12-13 10 views
-1

nullopt 대신 nullptr을 사용할 수없는 이유는 무엇입니까? 그리고 왜 {}nullopt처럼 번역됩니까?nullptr, {} 및 nullopt의 차이점

+4

당신은'std :: optional '를 가질 수 있습니다. – Jarod42

+5

존재하지 않는 선택적인 포인터는 존재하고'nullptr '인 포인터와 다릅니다. 디폴트로 초기화 된'optional'은 객체를 가져서는 안됩니다 (디폴트가 아닌 유형의 경우에는 사용할 수 없습니다). 그것은 나에게 명백한 것처럼 보인다. 또한'std :: optional'이 받아 들여지는 논문을 읽음으로써 질문에 대한 답을 얻을 수 있을지 궁금합니다. –

+1

'nullptr' = "포인터가 있지만 아무 것도 가리 키지 않습니다"; 'nullopt' : "아무것도 없다". – molbdnilo

답변

5
  • optional<T>T 포인터의 종류 아니라, 그것은 입니다 중 하나 T 또는 아무것도없는 값이다. 포인터와 참조에서 할 수있는 것처럼 "매달려있는 optional"또는 다른 종류의 "유효하지 않은"값을 가질 수 없습니다.

  • nullptr은 모든 포인터 유형의 값으로 변환 할 수있는 객체입니다.

  • nulloptoptional 유형의 값으로 변환 할 수있는 객체입니다.

  • {}T는이 컨텍스트에 어떤 유형의 "타입 T 의 기본 구성 객체를"수단 식 (콘텍스트의 값을 예상)한다. T이 포인터 유형이면 nullptr과 같습니다. Toptional 유형이면 nullopt과 같습니다. T이 산술 유형이면 0과 같습니다. T이 표준 컨테이너 유형 중 하나 인 경우 해당 유형의 다른 빈 컨테이너와 동일하게 비교됩니다.

3

이유는 nullptr 대신 nullopt 사용할 수 없습니다?

그들은 다른 것들이기 때문입니다. 그들은 뭔가 다른 것을 의미하고, 그들은 다른 무언가에 사용됩니다.

그것은 이미 수행 std::optionalnullptr 때문에 함께 사용하기위한 별개의 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의 사양이 작동하도록 작성되었습니다.