2017-07-18 6 views
4
cout << std::is_assignable<int*, std::nullptr_t>::value << endl; 
cout << std::is_assignable<int*&, std::nullptr_t>::value << endl; 

La sortie est:C++ - Pourquoi nullptr_t n'est pas assignable à int *?

Je ne comprends pas pourquoi le premier chèque retourne faux

je peux assigner nullptr à une référence à pointeur, mais je ne peut pas l'affecter à un pointeur brut?

C'est l'inverse!

int* p = nullptr; 
int*& pref = nullptr; 

La deuxième mission, comme prévu, des drapeaux une erreur:

error: cannot bind non-const lvalue reference of type int*& to an rvalue of type int*

Quelqu'un peut-il me expliquer ce qui se passe?

+2

Il est parce que vous essayez d'initialiser une référence avec nullptr, ne lui assigner. Ne laissez pas '=' vous confondre. – VTT

+0

Je ne vois aucune affectation 'int *' ici, mais 'int * &' et cela semble erroné. – Fabien

+1

Bien sûr, vous ne pouvez pas affecter 'int *'. Sinon, quelque chose comme ça compilerait 'int a = 1; & a = nullptr; ' –

Répondre

2

La documentation sur cppreference couvre ceci.

std::is_assignable<int, int> est faux mais std::is_assignable<int&, int> est vrai.

http://en.cppreference.com/w/cpp/types/is_assignable

+1

Oui, voir [cette question] (https://stackoverflow.com/questions/19920213/why-is-stdis-assignable-counter-intuitive), dont GSerg [mentionné est un doublon] (https: //stackoverflow.com/questions/45177674/c-why-is-nullptr-t-not-assignable-to-int#comment77323990_45177674) –