Foo b = nullptr;
이 작동하지 않는다면 쉽게 해킹 할 수 있습니다. 명시 적 생성자는 int
이고 암시 적은 std::nullptr_t
입니다.
작동하는 것이 마음에 드신다면 가능하지 않을 수 있습니다. 리터럴 0
과 다른 정수 리터럴을 구별하는 유일한 방법은 이전의 암시 적 포인터 변환과 nullptr_t
입니다. 따라서 nullptr
은 포인터 매개 변수에 nullptr_t
매개 변수를 선호하므로 두 생성자를 모두 사용하여 nullptr
인수를 필터링 할 수 있습니다. 그러나 0
에서 포인터로의 변환과 nullptr_t
의 변환은 동일한 순위이므로 0
인수를 모호하게 만듭니다.
흠 ... 이런 식으로 뭔가 작동 할 수 있습니다
class Foo {
struct dummy;
public:
explicit Foo(int); // the version that allows Foo x(1);
Foo(dummy*); // the version that allows Foo x = 0;
template <typename T,
typename = typename std::enable_if<
std::is_same<T, std::nullptr_t>::value>::type>
Foo(T) = delete; // the version that prevents Foo x = nullptr;
};
실제로이 시도하지 않았습니다. 이론적으로 템플릿은 인수가 nullptr
일 때만 과부하 해결에 참여해야합니다. 그렇지 않으면 SFINAE가이를 없애기 때문입니다. 그러나이 경우 포인터 생성자보다 좋을 것입니다.
'Foo e (1);'은 어떨까요? 어떻게 유효합니까? –
@ LuchianGrigore : 의미 상 동일합니까? 그렇다면 무효라고 선언 할 수 있다고 생각합니다. – Eric
아마도'std :: nullptr_t'를 사용하여 생성자를 시도해 볼 수 있습니다 (단지 아이디어입니다 ...) –