Мы заводим структуру данных, которая конструируется от аргумента типа double. И вторую структуру, которая конструируется от первой.
А дальше создадим переменную второго типа.
#include<iostream>
struct A {
double v;
explicit A(double d) : v(d) {}
};
struct B {
double v;
explicit B(A a) : v(a.v) {}
};
int main(){
double d = 3.14;
B b(A(d));
}
Проигнорируем ворнинги компиляторов (кого оно волнует, компилируется же).
А что будет, если мы выведем значение перменной
b?int main(){
double d = 3.14;
B b(A(d));
std::cout << b << std::endl;
}Внезапно, выведет 1:
Program returned: 0
1
Чта?!
Ну, пришло время почитать ворнинги. И выясняем, что вот это:
B b(A(d));
не переменная. Это - функция. Дело в том, что вот два таких объявления функций, в целом, одинаковые:
void f(int a);
void q(int(a));
Мы вполне легально можем аргументы функции заключать в скобки при объявлении функций... А все, что может быть трактовано в С++ как объявление функции, должно быть трактовано как объявление функции.
И.... Я не знаю, как оно так в итоге так получается, но стреляет время от времени...
Добро пожаловать к нам в дурку.