Сообщение Re[8]: range-declaration при range-based for от 29.11.2023 14:43
Изменено 29.11.2023 14:58 rg45
Re[8]: range-declaration при range-based for
Здравствуйте, reversecode, Вы писали:
R>
R>и не только на make_shared
R>там на много другого тоже самое
R>на std::map итд
Так в std::make_shared коструктор используется как раз эксплиситный. И этот пример с успехом компилит не только msvc:
http://coliru.stacked-crooked.com/a/3b5f64924da2429a
Имплиситный конструктор был бы, если бы компилилось что-то типа такого:
Но такое не компилится, к счастью, нигде, в т.ч. и в msvc.
R>
R>struct A
R>{
R> int a;
R> std::string b;
R> float c;
R> //итд
R>// A(int aa):a(aa){} // не обявив явно не работает в gcc clang
R>};
R>int main()
R>{
R> auto p = std::make_shared<A>(3);
R>}
R>
R>и не только на make_shared
R>там на много другого тоже самое
R>на std::map итд
Так в std::make_shared коструктор используется как раз эксплиситный. И этот пример с успехом компилит не только msvc:
http://coliru.stacked-crooked.com/a/3b5f64924da2429a
Имплиситный конструктор был бы, если бы компилилось что-то типа такого:
void foo(A);
int main()
{
foo(3);
}
Но такое не компилится, к счастью, нигде, в т.ч. и в msvc.
Re[8]: range-declaration при range-based for
Здравствуйте, reversecode, Вы писали:
R>
R>и не только на make_shared
R>там на много другого тоже самое
R>на std::map итд
Так в std::make_shared коструктор используется как раз эксплиситный. И этот пример с успехом компилит не только msvc:
http://coliru.stacked-crooked.com/a/3b5f64924da2429a
Имплиситный конструктор был бы, если бы компилилось что-то типа такого:
Но такое не компилится, к счастью, нигде, в т.ч. и в msvc.
И вот так можно:
А вот так нельзя:
А вот если раскомментируешь user-defined конструктор в классе А, то станут возможны оба варианта. Хоть ты и называешь этот конструктор явным, на самом деле это user-defined implicit onstructor.
R>
R>struct A
R>{
R> int a;
R> std::string b;
R> float c;
R> //итд
R>// A(int aa):a(aa){} // не обявив явно не работает в gcc clang
R>};
R>int main()
R>{
R> auto p = std::make_shared<A>(3);
R>}
R>
R>и не только на make_shared
R>там на много другого тоже самое
R>на std::map итд
Так в std::make_shared коструктор используется как раз эксплиситный. И этот пример с успехом компилит не только msvc:
http://coliru.stacked-crooked.com/a/3b5f64924da2429a
Имплиситный конструктор был бы, если бы компилилось что-то типа такого:
void foo(A);
int main()
{
foo(3);
}
Но такое не компилится, к счастью, нигде, в т.ч. и в msvc.
И вот так можно:
A a_explicit{42}; // OK
А вот так нельзя:
A a_implicit = 42; // error: conversion from 'int' to non-scalar type 'A' requested
А вот если раскомментируешь user-defined конструктор в классе А, то станут возможны оба варианта. Хоть ты и называешь этот конструктор явным, на самом деле это user-defined implicit onstructor.