对std :: cout的引用会导致段错误

ole*_*leg 3 c++

以下代码导致gcc(Debian 6.3.0-18 + deb9u1)6.3.0 20170516上的段错误

#include <iostream>

template<typename LogT> class logger {
public:
    logger(LogT& log) : log_(log) {}
    template<typename T> LogT& operator<<(T const& t) {return log_ << "\n> " << t;}
private:
    LogT& log_;
};

template<typename LogT> class A {
public:
    void f() {
        alog << "world";
    }
    static LogT& alog;
};

logger<std::ostream> alog(std::cout);
template<> logger<std::ostream>& A<logger<std::ostream>>::alog = alog;


int main() {
    alog << "hello";
    A<logger<std::ostream>>().f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?当带有f()调用的行被评论时,段错误就会消失.

Vit*_*meo 8

template<> logger<std::ostream>& A<logger<std::ostream>>::alog = alog;
Run Code Online (Sandbox Code Playgroud)

在此行上alog引用完全相同的数据成员两次.Clang警告说:

警告:引用'alog'在其自己的初始化中使用时尚未绑定到某个值[-Wuninitialized]

您想要找到全局alog- 因此您可以使用范围解析运算符:

template<> logger<std::ostream>& A<logger<std::ostream>>::alog = ::alog;
Run Code Online (Sandbox Code Playgroud)

wandbox.org上的实例