2017-07-31 76 views
3

我遇到了一些問題,在實現我的項目在我STD元素的移動構造函數::陣列在Visual Studio 2013年的std ::移動(STD ::陣列)G ++ VS視覺C++

所以,我想在使用g ++ 5.3.0編譯的記事本++中做一個最小的例子。
才發現,在G ++我能做什麼,我試圖

例如G ++:

#include <iostream> 
#include <array> 

using namespace std; 

struct A{ 
    A() = default; 
    A(const A&) 
    { 
     cout << "copy constructed" << endl; 
    } 
    A(A&&) 
    { 
     cout << "move constructed" << endl; 
    } 
}; 

class B{ 
public: 
    B(array<A, 2>&& a) 
     : m_a(std::move(a)) 
    {} 
private: 
    array<A, 2> m_a; 
}; 

int main(){ 
    A foo; 
    cout << "=========1===========" << endl; 
    array<A, 2> a = { { foo, std::move(foo) } }; 
    cout << "=========2===========" << endl; 
    B b(std::move(a)); 
    cout << "=========3===========" << endl; 
    array<A, 2> a_second = std::move(a); 
    return 0; 
} 

輸出:

========= 1 === ========
拷貝構造
移動構造
========= 2 ===========
移動構造
移動構造
========= 3 ===========
移動構造
移動構造

當我試圖在(幾乎)相同的在視覺工作室2013的結果代碼是不同的:

輸出:

========= 1個===========
拷貝構造
移動構造
========= 2 ===========
拷貝構造
拷貝構造
========= 3 === ========
拷貝構造
拷貝構造

我如何使用移動構造函數在Visual C++和爲什麼的Visual C++拒絕在這裏使用他呢?

+0

OT,你真的需要發佈兩個代碼示例,因爲不必要的'stdafx.h'和'_tmain'? – LogicStuff

+1

[離線主題]'B(array &a):m_a(std :: move(a))'不是你想要將某物移動到對象中的方式。您將呼叫站點中的對象從沒有任何指示的情況下移開。 – NathanOliver

+0

@LogicStuff我想表明我沒有做任何不同的事情。 – turoni

回答

4

這是MSVS 2013中的一個錯誤。MSVS 2013 does not generate implicit move constructors。如果你在MSVS 2015或2017中運行它,你會得到相同的輸出。


我也想指出的是,

B(array<A, 2>& a) : m_a(std::move(a)) 

是不是你想要的對象移動到B。如果你想B採取陣列上,你應該有

B(array<A, 2>&& a) : m_a(std::move(a)) 

這意味着,而是採用

B b(a); 

,你必須使用

B b(std::move(a)); 

,現在你可以清楚地看到, a已從main中移除。

+0

我剛剛編輯了更好的構造函數B. 有沒有什麼辦法可以在MSV2013中得到相同的結果? – turoni

+1

@ turoni不幸的是沒有。它只是不能正確工作。 – NathanOliver

+0

@turoni您可以像繼承一樣編寫一個包裝'std :: array'的類型,並手動實現移動構造函數。 MSVC2013從來沒有爲你寫過一個合適的移動計算器,並且不會讓你「不接受」。 MSVC2017需要正確的'noexcept'才能在'std :: vector's中正常工作。這是一個巨大的痛苦。 – Yakk

2

Visual Studio 2013與C++ 11不完全兼容。移動對std容器的支持是那些「未完全實現」的部分之一。 您的示例適用於最新版本的VS2017,請參閱at Rextester

P.S. Here您可以在各種編譯器中獲得有關支持C++功能的詳細信息。