![](/img/trans.png)
[英]Initialize an std::array of a class without a copy/move constructor?
假設我有一個 class 沒有名為A的默認構造函數。 我可以在沒有復制/移動構造函數的情況下創建一個A對象數組(例如下面代碼中的l_Array ),但是當該數組是另一個 class 的成員時我會出錯(例如下面代碼中的初始化b )。 是否可以實現class初始化?#include <iostr ...
[英]Initialize an std::array of a class without a copy/move constructor?
假設我有一個 class 沒有名為A的默認構造函數。 我可以在沒有復制/移動構造函數的情況下創建一個A對象數組(例如下面代碼中的l_Array ),但是當該數組是另一個 class 的成員時我會出錯(例如下面代碼中的初始化b )。 是否可以實現class初始化?#include <iostr ...
[英]Can I copy-elide an immovable & uncopyable function result into an optional?
我想在std::optional中存儲一個不可移動且不可復制的非平凡類型。 然而,object 是由免費的 function 構建的。(示例) 不改變Foo或foo() ; 感謝復制省略,我已經可以做到這一點: 這也可以編譯,因為std::optional只要求存儲的類型是可破壞的: 但我無法用 ...
[英]Number of copies when -fno-elide-constructors flag is passed to the compiler
考慮以下課程: 和一個簡單的工廠方法 我想在禁用復制省略的情況下進行編譯,以查看調用復制構造函數的次數。 我得到這個輸出: 所以復制構造函數被調用了兩次,但我真的不明白為什么。 在運行這個實驗之前,我敢打賭一個電話就足夠了。 我想知道這兩個副本而不是一個副本背后是否有任何動機,或者它只是特定於實現的 ...
[英]Why doesn't "Guaranteed Copy Elision" mean that push_back({arg1, arg2}) is the same as emplace_back(arg1, arg2)?
首先,我聽說Guaranteed Copy Elision是用詞不當(據我目前了解,它更多是關於從根本上重新定義基本價值類別,r/l-values 到 l/x/pr-values,這從根本上改變了意義和副本的要求),但由於這是通常所說的,我也會這樣做。 在閱讀了一些關於這個主題的內容之后,我想我終 ...
[英]Is it possible to in-place initailize std::variant given a factory object and variadic arguments list?
std::variant有一個構造函數,它接受std::in_place_t<Type>, Args &&... arguments 導致就地構造。 我想知道是否有可能在給定工廠 object 的情況下就地構造: https://godbolt.org/z/rY5W ...
[英]Is move elision guaranteed in this case?
考慮以下 C++20 代碼; 假設T是不可移動和不可復制的:struct Cell { Cell(T&& instance) : obj(std::move(instance)) {} private: T obj; }; Cell cell(T{/* argu ...
[英]Does an implementation that returns fundamental types by value using registers do "temporary materialization"?
(c++20;工作草案 N4868) [stmt.return]/2表示return語句通過復制初始化初始化glvalue結果或prvalue結果object return 語句通過操作數的復制初始化 (9.4) 初始化(顯式或隱式) function 調用的泛左值結果或純右值結果 obje ...
[英]Copy-elision in direct initialization from braced-init-list
在以下程序中,object A a直接從 braced-init-list {A{}}初始化: MSVC 和 GCC 在這里打印0表示發生復制省略。 並且 Clang 打印1執行復制構造函數。 在線演示: https://gcc.godbolt.org/z/1vqvf148z 哪個編譯器在這里? ...
[英]best strategy for ensuring no copies in return by value
我正在使用 c++17,但我無法選擇我的編譯器。 假設我有帶有移動和復制語義的類型 S。 通常對我來說 S 將是某種聚合類型的 std::vector 。 我還使用了 function g,它按值返回 S: S g(int x); 進一步假設我正在寫這個 function, f,帶有一個返回語句: ...
[英]Is it possible to intentionally defeat guaranteed copy elision for a particular type?
在 C++17 及更高版本中,保證復制省略意味着可以通過一系列函數返回不可移動對象,一直到最終調用者: struct NonMoveable { NonMoveable() = default; NonMoveable(NonMoveable&&) = delete; }; ...
[英]Why doesn't RVO happen with structured bindings when returning a pair from a function using std::make_pair?
考慮這段代碼,它定義了一個簡單的 struct Test (帶有默認構造函數和復制構造函數)並從函數返回一個std::pair <Test, Test> 。#include <iostream> #include <utility> using namespa ...
[英]Can initializing an object with a prvalue function result call the move constructor?
我從這段代碼開始展示 NRVO 的效果: struct test_nrvo { bool b; long x[100]; // Too large to return in register }; test_nrvo tester(test_nrvo* p) { test ...
[英]Temporary lifetime extension mixed with copy elision object on clang
我在我的一個項目中遇到了一個問題,它使用聚合類型以相對安全的方式延長臨時對象的生命周期,方法是使包含引用不可復制和不可移動的聚合,但是強制復制/移動省略(C++17)不在乎如果一個對象是可復制的或可移動的。 這一切都很好,因為在我看來,復制/移動不應該真正發生,因為實際上應該只有一個對象。 在我的例 ...
[英]Function argument pass-by-value faster than pass-by-reference?
我進行了一次采訪,在那里我得到了以下函數聲明: 我建議不要復制向量,而應該使用 const-reference(更不用說 const copy 沒有多大意義),但面試官聲稱編譯器復制省略會處理它。 我當場無法提出任何有力的論據,但今天我做了一些研究。 我實現了以下兩個簡單的示例函數: 從g ...
[英]std::vector doesn't construct in place
我有這個小測試代碼來顯示 std::vector 對class A執行的各種操作。 我對完成了多少復制操作感到有點失望。 更新: 我忘記了移動構造函數中的noexcept 。 固定的。 不能移動std::initializer列表。 所以我擴展了std::vector並使用模板參數包來移動使用std ...
[英]Why disabling copy elision for std::atomic doesn't work using C++17?
對於std::atomic復制構造函數被刪除,並且由於復制省略,這應該只用 C++17 和更高版本編譯:std::atomic<int> t_int = 1; 我預計它不會使用-fno-elide-constructors標志進行編譯,但它仍然可以編譯: https://godb ...
[英]Shouldn't there be a copy ctor invocation here? Elision disabled (no named return value optimization)
我認為這是典型的 NRVO 示例。 我正在使用-fno-elide-constructors編譯,我看到調用了以下內容:ctor、move ctor、dtor、dtor。 所以第一個 ctor 調用對應於行Test t; ,移動 ctor 正在構造main中的t2 ,然后從get_test返 ...
[英]Copy constructor implicitly called?
我有以下 class,其中定義了普通構造函數和復制構造函數。 在主要的 function 中,它按我的預期打印普通構造函數,並且只打印普通構造函數。 但是,如果我將復制構造函數設為 class 的私有成員,編譯器會給出錯誤 從它的外觀來看,它看起來像是調用了復制構造函數,但我沒有看到從中打印出任何 ...
[英]Demonstrating Move Constructor Usefulness
我試圖證明移動構造函數在消除不必要的復制方面的有用性。 但是,當我在 Release 中運行時,Visual Studio 優化器會忽略副本。 當移動構造函數不可用時不會調用復制構造函數,並且顯然在添加移動構造函數時不會調用移動構造函數。 我可以通過在 Debug 中運行來刪除優化,但這並不能很好 ...
[英]gcc: invalid error "use of deleted function" (copy constructor)?
簡化問題: Output 使用 MSVC 編譯時; 或 gcc / MSVC 和未刪除的復制構造函數變體處於活動狀態(上面已注釋掉): --> 從不使用復制構造函數; MSVC 按原樣成功編譯。 按原樣編譯 gcc(v9.3.0 當前 mingw/msys64 構建): 為什么 gcc ...