struct S {};
void foo(volatile S&);
void foo(S);
int main() {
volatile S v;
foo(v);
}
Компиляторы расходятся во мнениях: MSVC принимает код, а Clang и GCC говорят, что вызов неоднозначен (демо).
Мы можем доказать это только 1-й кандидат может принять v, если мы закомментируем одного из кандидатов (и в этом случае составители согласятся):
int main() { volatile S v; foo(v); } [/code] Компиляторы расходятся во мнениях: MSVC принимает код, а Clang и GCC говорят, что вызов неоднозначен (демо). Мы можем доказать это только 1-й кандидат может принять v, если мы закомментируем одного из кандидатов (и в этом случае составители согласятся): [list] [*]Если мы сохраним только 1-й, код компилируется. [*]Если оставить только 2-й, то получим ошибку ([code]S[/code] не имеет копировщика. от энергозависимого S&). [/list]