Funkcja nieokreślona i wartość domyślna

0

Witam!
Głowi mnie pytanie na uczelni. otóż czy funkcjia z nieokreśloną liczbą argumentów, może zawierać parametry z wartościami domyślnymi? Prosiłbym o uzasadnienie.

5

Co stoi na przeszkodzie, żeby wziąć kompilator i sprawdzić?

argumenty.cpp:4:43: error: default argument missing for parameter 2 of ‘void would_it_work(int, const char*, ...)’
4 | void would_it_work(int x = 0, const char* abc...) {
  |                               ~~~~~~~~~~~~^~~
argumenty.cpp:4:38: error: expected ‘)’ before ‘,’ token
    4 | void would_it_work(const char* abc..., int x = 0) {
      |                   ~                  ^
      |                                      )
argumenty.cpp:4:40: error: expected unqualified-id before ‘int’
    4 | void would_it_work(const char* abc..., int x = 0) {
      | 
5

Otagowałeś C++, nie C, także tu mozliwości są dwie:
a. nie, jezeli mowa o runtime’owej zmiennej liczbie argumentów, vide co @Althorion napisał...
b. ...ale dla wariadycznych templatek da się to zrobić korzystając z tuple jako workaroundu: https://stackoverflow.com/a/70484876/4885321

3

Używanie Variadic Arguments z C we współczesnym C++ to nieporozumienie.
Jest tylko dla utrzymania wstecznej kompatybilności.
Od C++11 powinno się używać Parameter pack.
Do C++20 wartości domyślne razem parameter pack nie miały sensu, bo jak odróżnić, że nadpisywana jest wartość domyślna, a od argumentów paczki parametrów?
W C++20 jednak pojawiło się std::source_location, które opiera się na wartości domyślnej.
Tu po prostu wartość domyślna jest zawsze nadawana, tyle że zmienia się od miejsca wywołania, więc parameter pack zgarnia wszystko.
Demo


Ok troszkę się mylę, ma to sens od C++20, ale jest możliwe już od C++17

Próbowałem przeskoczyć do C++14/11 (dlatego dodałem DoIt, by zastąpić fold expresion z C++17), ale bez template deduciton guide z C++17 nie dałem rady tego przeskoczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1