簡體   English   中英

MSVC和Clang之間的支持或相等的初始化行為不一致

[英]Inconsistent brace-or-equal initialization behavior between MSVC and Clang

我有以下代碼,我在Visual Studio 2013和Clang上編譯:

#include <memory>

template<typename T>
class foo
{
public:
   typedef void (T::*CallbackFn)();

   foo(T* mem, CallbackFn cb) : m_member(mem), m_cb(cb) {}

private:
   T* m_member;
   CallbackFn m_cb;
};

class another
{
private:
   void callback() {}

public:
   std::unique_ptr<foo<another>> f{new foo<another>(this, &another::callback)};
};

int main() {}

Coliru的現場樣本

在clang和GCC上編譯時,此代碼工作正常。 但是在VS2013上它失敗了:

main.cpp(22): error C2276: '&' : illegal operation on bound member function expression
main.cpp(22): error C2664: 'foo<another>::foo(const foo<another> &)' : cannot convert argument 1 from 'another *const ' to 'const foo<another> &'
          Reason: cannot convert from 'another *const ' to 'const foo<another>'
          No constructor could take the source type, or constructor overload resolution was ambiguous

出於某種原因,VS編譯器試圖調用foo的拷貝構造函數,這根本沒有意義。 它完全忽略了構造函數的第二個參數。

有趣的是,如果我將foo的構造函數調用更改為大括號,如下所示:

std::unique_ptr<foo<another>> f{new foo<another>{this, &another::callback}};

它在MSVC上運行得很好。 誰能解釋這種行為? 一種方式比另一種更正確嗎? 這只是另一個MSVC錯誤還是由於某些不受支持的C ++ 11功能?

誰能解釋這種行為?

一旦編譯器遇到第一個錯誤,其余的只是垃圾。 忽略它。 (我通常只看到出現的第一個編譯器錯誤,請參閱此處的VC ++)

一種方式比另一種更正確嗎?

在這種情況下,兩者都完全相同。 MSVC根本無法解析&another::callback ,然后忽略它以進一步分析該行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM