Прямой ответ: грамматика C ++ не объединяет аргументы функции в агрегаты ни при каких обстоятельствах.Ни в коем случае вызов f(a, b)
не будет рассматриваться как вызов f(c)
, где c
- это значение, построенное из некоторой комбинации a
и b
.Это просто не так, как работает язык.Каждый аргумент всегда обрабатывается отдельно для перегрузки, неявного преобразования и всех других целей.
Что касается обоснования, если то, о чем вы спрашиваете, разрешено, как вы ожидаете, что эта ситуация будет разрешена:*
class A {
public:
A(int a) : v1(a) {}
private:
int v1;
};
class B {
public:
B(int a, int b) : v1(a), v2(b) {}
private:
int v1;
int v2;
};
class C {
public:
C(int a, int b, int c) : v1(a), v2(b), v3(c) {}
private:
int v1;
int v2;
int v3;
};
void f(A obj1, A obj2) { /* ... */ }
void f(B obj) { /* ... */ }
void g(A obj1, B obj2) { /* ... */ }
void g(B obj1, int i) { /* ... */ }
void g(C obj) { /* ... */ }
int main() {
f(22, 23); // Call f(A,A) or f(B)?
g(22, 23, 24); // Call g(A,B) or g(B, int), or g(C)?
return 0;
}