aşağıdaki programı ele alalım ctor kopyalayın:dönersek geçicileri/
#include<iostream>
using namespace std;
struct S
{
S() = default;
S(const S& other) = delete;
S(S&& other) = delete;
int i;
};
S nakedBrace()
{
return {}; // no S constructed here?
}
S typedBrace()
{
return S{};
}
int main()
{
// produce an observable effect.
cout << nakedBrace().i << endl; // ok
cout << typedBrace().i << endl; // error: deleted move ctor
}
Numune oturumu:
$ g++ -Wall -std=c++14 -o no-copy-ctor no-copy-ctor.cpp
no-copy-ctor.cpp: In function 'S typedBrace()':
no-copy-ctor.cpp:19:12: error: use of deleted function 'S::S(S&&)'
return S{};
^
no-copy-ctor.cpp:8:5: note: declared here
S(S&& other) = delete;
Bu gcc nakedBrace()
kabul ettiğini beni hayrete düşürüyor. Kavramsal olarak iki fonksiyonun eşdeğer olduğunu düşündüm: Geçici bir S
inşa edildi ve geri döndü. Kopyalama işlemi gerçekleştirilebilir veya gerçekleştirilemez, ancak taşıma veya fotokopi kağıdının (her ikisi de burada silinir) yine de standart tarafından belirtildiği gibi erişilebilir olması gerekir (12.8/32).
Bu, nakedBrace()
'un hiçbir zaman bir S? Ya da, küme-başlatma ile doğrudan geri dönüş değeri yapar, böylece hiçbir kopya hareket/ctor kavramsal olarak gerekli değildir?