【问题标题】:Referring to this pointer in a static assert?在静态断言中引用这个指针?
【发布时间】:2013-06-28 22:19:41
【问题描述】:

是否可以编写引用“this”指针的静态断言?我没有可用的 c++11,并且 BOOST_STATIC_ASSERT 不起作用。

struct blah
{
   void func() {BOOST_STATIC_ASSERT(sizeof(*this));}
};

生产:

error C2355: 'this' : can only be referenced inside non-static member functions
error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE'

在 MSVC 2008 中。

动机:

#define CLASS_USES_SMALL_POOL() \
   void __small_pool_check()     {BOOST_STATIC_ASSERT(sizeof(*this) < SMALL_MALLOC_SIZE;} \
   void* operator new(size_t)    {return SmallMalloc();}                                  \
   void operator delete(void* p) {SmallFree(p);}

【问题讨论】:

  • 我以为 sizeof 总是编译时间?这适用于示例,但我试图在不重复命名类型的情况下实现宏,请参阅动机部分。
  • 没关系。这里是凌晨 1 点 30 分。不应该在这种时候回答问题。你是对的。 *this 具有明确定义的类型。
  • int unused[SMALL_MALLOC_SIZE-sizeof(*this)];
  • 也许你的__small_pool_check 实际上是静态的。或者你写了static CLASS_USES_SMALL_POLL()...
  • @MarcGlisse 不错!!!

标签: c++ boost this static-assert


【解决方案1】:

问题在于BOOST_STATIC_ASSERT是一个,它解析为一个C++结构,其中你的this关键字有不同的含义。

要解决这个问题,你可以试试这个:

struct blah
{
   void func()
   {
      const size_t mySize = sizeof(*this);
      BOOST_STATIC_ASSERT(mySize);
   }
};

【讨论】:

    【解决方案2】:

    我在GCC explorere 中尝试了您的代码,它编译得很好。不知道为什么 boost 版本不起作用,尤其是那个错误。

    struct blah
    {
      int a, b;
       void func() {static_assert(sizeof(*this) > 4, "big");} // triggers if you remove b.
    };
    
    // -Wall -pedantic --std=c++11
    

    【讨论】:

    • BOOST_STATIC_ASSERT 似乎奇怪地为 MSVC 实现了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多