Стратегии для Сота & amp; Обратная совместимость

Это не полный ответ, хотя он слишком длинный, как комментарий. Я постараюсь предложить контрпример к вашим рассуждениям, и я готов смотреть вниз, потому что я далек от того, чтобы быть уверенным. В любом случае, давайте попробуем! : -)

Это следует из приведенного примера:

struct A {
    A(int, int) { }
};

struct B {
    B(A) { }
    explicit B(int, int ) { }
};

int main() {
    B paren({1, 2});
}

В этом случае утверждение {1, 2}, по-видимому, дает два решения:

  • с помощью B(A), поскольку A(int, int) не является явным и, следовательно, это разрешено, и это фактически первый кандидат
  • по той же причине, что и выше, его можно интерпретировать как B{B(A{1,2})} (ну, позвольте мне оскорбить нотацию, чтобы дать вам представление и что я имею в виду), то есть {1,2} позволяет построить временный объект B, который используется сразу после аргумента для конструктора copy / move, и это снова разрешено, потому что задействованные конструкторы не являются явными

. Последний объясняет второй и третий кандидаты.

Имеет ли смысл? Я готов удалить ответы до тех пор, пока вы объясните мне, что не так в моих рассуждениях. : -)

30
задан Programmer Bruce 29 May 2011 в 06:47
поделиться