小编Rio*_*pho的帖子

c ++模板奇怪的优化

我像boost一样写了一个单例模板类:

template <typename _T>
class Singleton
{ 
    public :
    static _T* Instance()
    {
        static _T obj;
        return &obj;
    }

protected :
    Singleton() {}

private :
    struct ObjectCreator
    {
        ObjectCreator()
        {
            Singleton<_T>::instance();
        }
    };

    static ObjectCreator object_creator;
};

template <typename _T>
typename Singleton<_T>::ObjectCreator Singleton<_T>::object_creator;
Run Code Online (Sandbox Code Playgroud)

我写了主要功能来测试它.

#include "Singleton.h"
class A : public Singleton <A>
{
    public:
        int a;
};


int main()
{
    A::Instance()->a = 2;
}
Run Code Online (Sandbox Code Playgroud)

我知道我错误地输入了Instance in ObjectCreator的构造函数,奇怪的是我可以通过gcc-4.4.7正确编译它,然后我使用了clang-6.0,它打了我的错字.

我猜gcc可以做一些优化,因为我没有做任何事情ObjectCreator,所以它忽略了错误代码.

我有两个问题:

  1. 我应该怎么做让gcc报告我错误(不改变我的代码),比如添加一些编译器标志?
  2. 如果有人对此有更可靠的解释?一些官方文件会这样做.

Ps:我知道boost会添加一个do_nothing函数ObjectCreate …

c++ gcc templates clang

16
推荐指数
1
解决办法
435
查看次数

标签 统计

c++ ×1

clang ×1

gcc ×1

templates ×1