(На работе меня игнорируют, так что спрошу здесь.)
Требуются люди со скиллом C++ Standard Interfacing V.
Explain:
$ cat cpp.cpp
#include <vector>
struct A
{
std::vector<int> v;
};
struct B
{
B()
#ifdef WITH_INIT
: a()
#endif
{}
A a;
};
int main()
{
B b;
b.a.v.push_back(42);
}
$ g++ -O0 -S -o cpp.s.0 cpp.cpp
$ g++ -O0 -S -o cpp.s.1 cpp.cpp -DWITH_INIT
$ diff -u cpp.s.0 cpp.s.1
--- cpp.s.0 2014-08-26 15:42:19.635177434 +0300
+++ cpp.s.1 2014-08-26 15:42:25.295177509 +0300
@@ -80,6 +80,12 @@
subq $16, %rsp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
+ movq $0, (%rax)
+ movq -8(%rbp), %rax
+ movq $0, 8(%rax)
+ movq -8(%rbp), %rax
+ movq $0, 16(%rax)
+ movq -8(%rbp), %rax
movq %rax, %rdi
call _ZN1AC1Ev
leave
Мне интересно, это gcc/libstdc++ бажит, или там нечто в стандарте позволяет так делать?