Информация об изменениях

Сообщение 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>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>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.