Похоже, мы можем безопасно использовать объект std::cout
в конструкторах объектов со статической продолжительностью хранения, как указано в этом question.
Однако я не совсем уверен, что мы можем безопасно использовать их в случае переменных шаблонов:
#include <iostream>
template<class T>
T x = T{};
void foo()
{
class Test
{
public:
Test() { std::cout << "Test::Test\n"; }
};
Test t = x<Test>;
}
int main()
{
std::cout << "main\n";
}
Этот код разбивается на clang (живой пример), и я не уверен, что это ошибка или нет.