簡體   English   中英

為什么要通過rvalue引用和值來獲取std :: initializer_list?

[英]Why take a std::initializer_list by rvalue reference vs. by value?

采用std::initializer_list大多數C ++ 11代碼都是按值獲取的,但有時它是由rvalue引用獲取的。 這樣做有什么好的理由嗎?

例如,我遇到的幾乎所有例子都是這樣的:

class A {
  public:
  A(std::initializer_list<int>);
};

但我偶爾會看到這件事:

class B {
  public:
  B(std::initializer_list<int> &&);
};

據我所知,一般的使用和右值引用的目的,但為什么這些一個一個的情況下,可以優先於其他std::initializer_list 我唯一能想到的是class A允許初始化列表單獨構造, class B阻止這種情況。

std::initializer_list<int> values {1,2,3,4};
A a(values); // valid
B b(values); // error

但我想不出一個很好的理由,為什么要防止這是一件令人滿意的事情。

那么,為什么人們會通過rvalue引用而不是值來獲取std::initializer_list

我不確定我有充分的理由,但我的猜測是代碼的作者可能認為按值傳遞初始化列表會使列表中的元素不必要的副本。 當然,這不是真的 - 復制初始化列表不會復制基礎值。

即使按值傳遞, std::initializer_list體現了引用語義,因此通過引用傳遞充其量是誤導性的。 (它只包含非擁有指針。)

有通用引用綁定到任何東西,但它們不能通過braced-init-list語法(即{ x, y }initializer_list ,因此以這種方式獲取initializer_list引用將采用多種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM