void foo(Type1 a, Type2 b = value2)
Могу ли я знать, каковы ограничения типа 2 для параметра, который принимает значение по умолчанию? Я считаю, значение value2 типа2 должно быть решаемым во время компиляции.
Например, целое число. Это правильно?
У вас довольно много гибкости. value2
должно быть выражением, которое является действительным в точке объявления функции (под «действительным» я подразумеваю, что используемые им имена находятся в области видимости и т. д.), и его тип должен быть неявно преобразован в Type2
Так же, как и для любого инициализатора. value2
оценивается каждый раз, когда вызывается функция. Так, например:
#include <vector>
#include <iostream>
int i;
void foo(std::vector<int> v = std::vector<int>(i)) {
std::cout << v.size() << "\n";
}
int main() {
i = 1;
foo();
i = 2;
foo();
}
С правильным инициализатором, Type2
может даже быть ссылочным типом:
void bar(int &j = i);
value2
должен быть преобразован во время компиляции в Type2
,
Да исправить.
Единственное ограничение — переменная по умолчанию должна быть последней. Вы можете иметь несколько переменных по умолчанию, просто убедитесь, что все они находятся в конце. Не смешивайте с не по умолчанию.