Рассматривать:
#include <string>
#include <iostream>
class Foo
{
public:
Foo( char const * msg ) : x( y )
{
y = msg;
}
std::string const & x;
private:
std::string y;
};
int main( int argc, char * argv[] )
{
if ( argc >= 2 )
{
Foo f( argv[1] );
std::cout << f.x << std::endl;
}
}
Это компилирует и печатает первый параметр... но я сомневаюсь, действительно ли он "легален"/хорошо сформирован. Я знаю, что список инициализаторов должен инициализировать переменные в порядке их объявления в классе, чтобы вы не ссылались на переменные, которые еще не были инициализированы. Но как насчет переменных-членов не в списке инициализаторов? Могу ли я безопасно создавать ссылки на них в качестве демонстрации?
(Например, это, конечно, бессмысленно. Это просто для разъяснения того, о чем я говорю).