Rozważmy następujący konstruktordlaczego domyślny argument nie może zależeć od innego niż domyślny argumentu?
class MyClass {
MyClass(unsigned int dimension, std::vector vector=unitaryVector(dimension));
};
gdzie unitaryVector(d)
to funkcja zwraca losową std::vector
w d wymiarach.
To daje następujący błąd kompilatora:
error: default argument references parameter 'dimension'
MyClass(unsigned int dimension, std::vector vector=unitaryVector(dimension));
Dlaczego nie jest to idiom ważne w C++ 11? Wydaje się to dość oczywiste: jeśli podano argument vector
, init vector
jako kopia argumentu, w przeciwnym razie wywołaj funkcję i zainicjuj ją jako kopię zwracanej wartości. Dlaczego kompilator nie może tego zrozumieć?
Twoja prośba o funkcję wydaje się być bardzo rozsądną rzeczą, ale czy jest w standardzie? Jeśli nie, autorzy kompilacji nie są zobowiązani do jego implementacji. – pyon
możliwy duplikat http://stackoverflow.com/questions/1880866/cc-default-argument-set-as-a-previous-argument –
Możesz użyć std :: optional <> z domyślną wartością empty zamiast wyraźna wartość domyślna. Ma to tę zaletę, że wartość domyślna nie będzie częścią ABI i dlatego łatanie będzie łatwiejsze. – lorro