KI
Size: a a a
KI
V
S
VK
AK
VK
return f( vec2f( {0.f, 0.f} ) )
на return f( vec2f( vec2f{0.f, 0.f} ) )
заменить, то у msvc тоже только 1 вызов конструктора остаётся, copy/move не вызываются. Я сначала удивился, но на cppreference сказано, что в первом случае non-mandatory copy elision (т.к. the source object is a nameless temporary), а во втором — mandatory. Т.е. получается, что формально все компиляторы правы (хотя лучше бы msvc лишние операции убирала, конечно).VK
VK
return f( vec2f( vec2f{0.f, 0.f} ) )
всё работает на всех стандартах.V
AS
V
ПК
VK
struct vec
{ int x;
vec(): x{} {}
vec(const vec&): x{} {}
};
void f( vec v ){}
int main()
{
f( vec( {} ) );
}
// in MSVC this works w/o copy elision (C++14), bug with C++17,20;S
struct vec
{ int x;
vec(): x{} {}
vec(const vec&): x{} {}
};
void f( vec v ){}
int main()
{
f( vec( {} ) );
}
// in MSVC this works w/o copy elision (C++14), bug with C++17,20;