1 frag / 2 deaths
> Профессор ДиректИкс
> А как ты переменную заводил?
> Vector v{}?
Vector v{};
синтезировал встроенный конструктор, инициализирующий нулями;
Vector v; v.x = 2; cout << v.x;
без инициализатора-фигурные-скобки компилятор ругается на использование неинициализированной переменной, вообщем, присвоил 2, чтобы полю x , чтобы он не ругался — > конструктор не синтезируется; в поток выводится 2:
std::ostream::operator<<(std::cout, LODWORD(FLOAT_2_0), std::endl<char,std::char_traits<char>>);
вообщем, довольно интересно пока
1 frag / 2 deaths
> Vector v{}?
Это инициализирует поля в ноль.
Профессор ДиректИкс
Вот тут максимально простое определение: https://en.cppreference.com/w/cpp/language/default_constructor
The default constructor for class T is trivial (i.e. performs no action) if all of the following is true:
То есть всё что после можно заменить на одну мысль "не выполняет никаких действий" и всё.
Все эти условия про то, что конструктору по умолчанию не надо вообще ничего делать, соответственно и "синтезировать" нечего.
Очень интересно:
struct vector { float x,y,z; }; template<typename T> void construct1(T* ptr) { new( ptr) T( ); } template void construct1<vector>( vector*); // void construct1<vector>(vector*): // mov QWORD PTR [rdi], 0 // mov DWORD PTR [rdi+8], 0x00000000 // ret template<typename T> void construct2( T* ptr) { new( ptr) T; } template void construct2<vector>( vector*); // void construct2<vector>(vector*): // ret
Но вообще, Алекс правильно говорит, главная суть в том, что trivial default constructor — это нооп.
Имбирная Ведьмочка
> Это инициализирует поля в ноль.
А так?
Vector v();
Кто знает что произойдет с v - под спойлер пожалуйста
1 frag / 2 deaths
> Vector v();
1 frag / 2 deaths
> Vector v();
totoro
auto это ж для лохов
1 frag / 2 deaths
Зависит от контекста т.к. С++ контекстно-зависимый язык.
Для лохов вот:
totoro
> const auto& v = Vector();
struct vec { float x,y,z; }; void foo(vec* pv) { *pv = vec( ); } // foo(vec*): // mov QWORD PTR [rdi], 0 // mov DWORD PTR [rdi+8], 0x00000000 // ret
Имбирная Ведьмочка
Ясно. А к чему это, кстати?
UPD.
Старым дедовским способом, если ты про это, вот так надо: https://godbolt.org/z/fvGdzGr54
totoro
> Старым дедовским способом, если ты про это, вот так надо: https://godbolt.org/z/fvGdzGr54
Что надо?
Имбирная Ведьмочка
> Что надо?
Ну вектор инициализировать, а ты про что?
totoro
> Ну вектор инициализировать, а ты про что?
Ищем trivial default constructor. И там ищём, и сям ищем. И под кроватью смотрели, и за шкафом смотрели — а trivial default constructor всё нет и нет. Может быть, ты знаешь, куда спрятался trivial default constructor?
Имбирная Ведьмочка
> Может быть, ты знаешь, куда спрятался trivial default constructor?
В non-standard layout искали?
https://godbolt.org/z/M9PvYrsbf
Тема в архиве.