Учитываются ли преобразования аргументов по умолчанию при разрешении перегрузки? ⇐ C++
Учитываются ли преобразования аргументов по умолчанию при разрешении перегрузки?
Рассмотрим следующий код:
void foo(int* = 0); // (1) недействительный Фу (интервал = 0); // (2) интервал основной() { Фу (0); // ОК, вызывает (2) Фу(); // ошибка, неоднозначная перегрузка } И GCC, и clang действуют подобным образом, но я не уверен, что это правильно.
[expr.call] p6 просто говорит:
Если соответствующий аргумент отсутствует, используется аргумент по умолчанию для параметра.
Это говорит о том, что после вызова функции foo превратится в foo(0) и что 0 придется преобразовать в int* для (1).
Поэтому я считаю, что оба вызова функции должны быть действительными. Однако есть ли формулировки, противоречащие этой идее? Считаются ли преобразования аргументов по умолчанию «бесплатными», чтобы они не участвовали в последовательности преобразования?
Рассмотрим следующий код:
void foo(int* = 0); // (1) недействительный Фу (интервал = 0); // (2) интервал основной() { Фу (0); // ОК, вызывает (2) Фу(); // ошибка, неоднозначная перегрузка } И GCC, и clang действуют подобным образом, но я не уверен, что это правильно.
[expr.call] p6 просто говорит:
Если соответствующий аргумент отсутствует, используется аргумент по умолчанию для параметра.
Это говорит о том, что после вызова функции foo превратится в foo(0) и что 0 придется преобразовать в int* для (1).
Поэтому я считаю, что оба вызова функции должны быть действительными. Однако есть ли формулировки, противоречащие этой идее? Считаются ли преобразования аргументов по умолчанию «бесплатными», чтобы они не участвовали в последовательности преобразования?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение