2017-05-08 158 views
2

我有這樣的結構Rvalue構造函數沒有被調用?

struct A { 
    A()    { cout << "Default\n"; } 
    A(const A& a) { cout << "Const lvalue\n"; } 
    A(const A&& a) { cout << "Const rvalue\n"; } 
    A(A& a)   { cout << "Lvalue\n"; } 
    A(A&& a)  { cout << "Rvalue\n"; } 
}; 

我使用的是理解右值/左值它。

在做

A a1; 
A a2{ a1 }; 

const A a3; 
A a4{ a3 }; 

它正確地輸出

> Default 
> lvalue 
> Default 
> Const lvalue 

的問題是,當我這樣做

A a{ A() }; 

輸出是默認。但是不是A()有一個右值嗎?必須不要調用A::A(A&&)A::A(const A&&)?這裏發生了什麼?

+3

請允許我爲你指點['標準:: move'(http://en.cppreference.com/ w/cpp/utility/move) – InternetAussie

+0

謝謝,解決了這個問題,但是爲什麼在這個例子中我沒有給任何構造函數調用? – Garmekain

+0

複製構造函數不一定會被調用。在這種情況下,編譯器可能會在不復制的情況下直接創建'A()'來代替'a'。 – zoska

回答

4

你沒有看到Rvalue打印,因爲編譯器是eliding的舉動。即使構造函數具有副作用,也允許使用

如果傳遞-fno-elide-constructors到GCC或鏘然後你會看到輸出:

clang++ -std=c++14 -O2 -pedantic -fno-elide-constructors main.cpp && ./a.out 
Default 
Rvalue 

clang++ -std=c++14 -O2 -pedantic main.cpp && ./a.out 
Default