Size: a a a

2021 March 17

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
(double, int) (int64_t, int64_t) Такая пара триггерит неявное преобразование int64_t -> double
Пара (int, double) (int64_t, int64_t) неявное преобразование int->double не запускает
давайте так:
struct A {
   A(int64_t a, int64_t other) {std::cout << "A int: " << a << '\n';}
   A(double b, int other) {std::cout << "A double: " << b << '\n';}
};

...    
   int64_t x = 42;
   double other = 1.0f;

   A ax(x, other);
здесь все понятно почему вызывается первая перегрузка? для первой  перегрузки требуется одно преобразование второго аргумента, для второй два
источник

АС

Андрей Соловьев... in pro.cxx
Нет, здесь будет вызываться вторая пергрузка. С double
источник

АС

Андрей Соловьев... in pro.cxx
см wandbox выше
источник

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
Нет, здесь будет вызываться вторая пергрузка. С double
здесь вызывается первая перегрузка
источник

AS

Anatoly Shirokov in pro.cxx
поэтому приведите пример здесь, который вызывает вопрос
источник

АС

Андрей Соловьев... in pro.cxx
#include <iostream>
#include <cstdint>

struct A {
   A(int64_t a, int64_t other) {std::cout << "A int: " << a << '\n';}
   A(double b, int other) {std::cout << "A double: " << b << '\n';}
};


int main () {
   
   int64_t x = 42;
   double y = 3.14;
   int other = 3;

//    A ax(x, other);
   A ax((int64_t)x, (int64_t)other);
   A ay(y, other);
   
   return 0;
}
источник

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
#include <iostream>
#include <cstdint>

struct A {
   A(int64_t a, int64_t other) {std::cout << "A int: " << a << '\n';}
   A(double b, int other) {std::cout << "A double: " << b << '\n';}
};


int main () {
   
   int64_t x = 42;
   double y = 3.14;
   int other = 3;

//    A ax(x, other);
   A ax((int64_t)x, (int64_t)other);
   A ay(y, other);
   
   return 0;
}
так и теперь вызов, который непонятен
источник

АС

Андрей Соловьев... in pro.cxx
//    A ax(x, other);
источник

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
//    A ax(x, other);
почему неоднозначность?
источник

АС

Андрей Соловьев... in pro.cxx
Компилятор выбирает перегузку с double
источник

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
Компилятор выбирает перегузку с double
prog.cc:16:7: error: call to constructor of 'A' is ambiguous
   A ax(x, other);
     ^  ~~~~~~~~
prog.cc:5:5: note: candidate constructor
   A(int64_t a, int64_t other) {std::cout << "A int: " << a << '\n';}
   ^
prog.cc:6:5: note: candidate constructor
   A(double b, int other) {std::cout << "A double: " << b << '\n';}
   ^
1 error generated.
источник

АС

Андрей Соловьев... in pro.cxx
Да, все так
источник

AS

Anatoly Shirokov in pro.cxx
так, тогда в чем вопрос.
источник

АС

Андрей Соловьев... in pro.cxx
#include <iostream>
#include <cstdint>

struct A {
   A(int64_t a, int64_t other) {std::cout << "A int: " << a << '\n';}
   A(double b, int64_t other) {std::cout << "A double: " << b << '\n';}
};

struct C {
   C(int a, int64_t other) {std::cout << "C int: " << a << '\n';}
   C(double b, int64_t other) {std::cout << "C double: " << b << '\n';}
};


int main () {
   
   int64_t x = 42;
   double y = 3.14;
   int other = 3;

//    A ax(x, other);
   A ax((int64_t)x, (int64_t)other);
   A ay(y, other);
   
   int x1 = 43;
   C cx(x1, other);
   C cy(y, other);

   return 0;
}
источник

АС

Андрей Соловьев... in pro.cxx
В этом
источник

АС

Андрей Соловьев... in pro.cxx
int не попадает в неявное преобразование
источник

АС

Андрей Соловьев... in pro.cxx
Я не понимаю, почему
источник

DF

Dollar Føølish in pro.cxx
Может у сужающих преобразований ниже приоритет ?
источник

AS

Anatoly Shirokov in pro.cxx
Андрей Соловьев
int не попадает в неявное преобразование
C cx(x, other);
 зафиксируем это. сколько преобразований здесь должно произойти чтобы вызвать первую перегрузку?
источник

AS

Anatoly Shirokov in pro.cxx
int64_t -> int, int-> int64_t
источник