2013-03-13 67 views
2

我似乎遇到了編譯器/庫錯誤。當我嘗試MSVC - 我如何知道一個類型是否必須移動?

#include <iostream> 
#include <type_traits> 
#include <memory> 

int main() 
{ 
    typedef std::unique_ptr<int> T; 

    std::cout << "is_copy_assignable: " 
       << std::is_copy_assignable<T>::value 
       << "\n" 
       << "is_copy_constructible: " 
       << std::is_copy_constructible<T>::value << "\n"; 
} 

與Visual Studio 2012 Update 1中,我得到

is_copy_assignable: 1 
is_copy_constructible: 1 

代替

is_copy_assignable: 0 
is_copy_constructible: 0 

是否有其他解決方案?

+0

還有一個相關的問題:https://stackoverflow.com/questions/34135409/why-does-is-copy-constructible-return-true-for-unique-ptr-in-msvc12 – stgatilov 2018-03-04 07:05:27

回答

3

這當然是錯誤 MS的執行std::unique_ptr<>或類型特徵。這些類型特徵應該如你所期望的那樣工作(參見實例here)。

+0

我認爲代碼也失敗與公衆的複製ctor。 – 2013-03-13 21:53:06

+0

@JesseGood:你說得對,謝謝你指出。 – 2013-03-13 21:55:59

3

如果您往下看發生了什麼,它會檢查賦值運算符和ctor 是否存在,這就是全部。在MSVC的實現中,複製構造函數和賦值運算符是privatestd::unique_ptr的實現。但是它不會進行任何訪問檢查。 MSVC尚未實施= delete等,這就是爲什麼它返回true

與它玩了一會兒後,我覺得我有什麼,應該用於檢測私人拷貝構造函數工作:

#include <type_traits> 
#include <memory> 

template <typename T> 
struct wrap 
{ 
    T t; 
}; 

template<typename T, typename = int> 
struct is_copyable : std::false_type { }; 

template<typename T> 
struct is_copyable<T, 
    decltype(wrap<T>(std::declval<const wrap<T>&>()), 0)> : std::true_type 
{}; 

class X 
{ 
    public: 
    X(const X&) {} 
}; 

class Y 
{ 
    Y(const Y&){} 
}; 

int main() 
{ 
    static_assert(is_copyable<std::unique_ptr<int>>::value, "Error!"); 
    static_assert(is_copyable<X>::value, "Error!"); 
    static_assert(is_copyable<Y>::value, "Error!"); 
} 

Example on LWS

但是,這造成了ICE與MSVC ...所以不起作用。

相關問題