Perché decltype non può essere aggiunto implicitamente a un'espressione quando era previsto il tipo?Perché decltype non è implicito?
template <class X, class Y, class Z>
auto foo(X x, Y y, Z z){
std::vector<decltype(x+y*z)> values; // valid in c++11/c++14
//std::vector<x+y*z> values; // invalid
values.push_back(x+y*z);
return values; // type deduced from expression - OK
}
In C++ 14 i compilatori saranno in grado di dedurre il tipo di ritorno della funzione in base alle espressioni di ritorno. Perché questo non può essere esteso a nessuna conversione di 'espressione -> tipo'?
Lo stesso si applica a declval, perché devo scrivere:
std::vector<decltype(declval<X>() + declval<Y>() * declval<Z>())> values;
invece di:
std::vector<X+Y*Z> values;
'decltype' è davvero così fastidioso da digitare in cambio di essere chiaramente un tipo invece di prendere un momento per capire se un'espressione è un tipo o un valore? – chris
Sono abbastanza sicuro che possa introdurre un parsing ambiguo ... – Jarod42
... per pochissimi benefici. C'è già un sacco di cose implicite in corso in C++. Esplicito = buono, implicito = cattivo. – jrok