[英]How to use const_reference type to declare a variable and assign to it, the return value of front() function
我聲明了一個向量並用三個值初始化它,
vector<int> vec{1, 2, 3};
我試圖將 vec.front() 的返回值分配給一個引用變量a
。
如何聲明使用正確的數據類型?
我試過,
vector<int>::const_reference &a = vec.front();
但這句話是什么意思?
我可以先使用正確的數據類型聲明變量 a 然后使用
a = vec.front();
將 vec.front() 的返回值賦給變量a
? 如果是,那我應該寫什么?
我可以先使用正確的數據類型聲明變量 a 然后使用
a = vec.front();
將 vec.front() 的返回值賦給變量
a
a
不是正常變量; 它是一個引用,聲明一個引用而不說明它所指的是什么是不合法的:
const int& a; // Illegal
聲明引用后,對變量執行的所有操作實際上都是對其引用的值執行,因此您永遠無法更改引用引用的內容。
const int& a = b;
a = 10; // Changed the value of b.
我試過了,
vector<int>::const_reference &a = vec.front();
這似乎是一種過於冗長的說法:
const int& a = vec.front();
vec.front()
返回對向量前元素的引用。 const int& a = vec.front()
聲明變量a
使其成為對向量前元素的引用。
這通過承諾只讀值來避免復制。
如果你說:
int a = vec.front();
a
現在是數組第一個元素的副本,但您可以自由更改它。
在 int 的情況下,沒有性能優勢。 但是,如果您的向量是string
s 的向量,則引用將避免復制字符串,如果您不打算修改內容,這可能比引用具有顯着的性能優勢。
std::string str = "hello world, this is a long string.";
const std::string& a = str; // Reference, no copy
std::string b = str; // Copy of str, takes extra effort
vector::front()
返回對向量中第一個元素的引用。 因此,您可以聲明存儲在向量中的類型的引用,也可以使用向量類中定義的類型( vector<int>::reference
或vector<int>::const_reference
)來聲明引用。
vector <int> v1;
v1.push_back(10);
v1.push_back(11);
vector<int>::reference var1 = v1.front( ); // Returns a reference to the first element you can modify or
int& x = v1.front(); // returns a reference to the first element you can modify
.....
vector<int>::const_reference var2 = v1.front(); // Returns a reference to the first element you can't modify
const int& y = v1.front(); // Return a reference to the first element you can't modify
我可以先使用正確的數據類型聲明變量 a 然后使用
不可以。由於您要聲明引用,因此必須在聲明期間對其進行初始化。
還有一件事:
vector<int>::const_reference &a=v1.front(); // This will not compile, because you are trying to take a reference of a reference
除了@kfsone 的好答案之外,還有一個(讓我說)技巧可以做類似於您所要求的事情。
我會做所有事情,但我在下面向您展示的內容。
無論如何,為了完整起見,如果您有一個reference_wrapper
,您實際上可以將它重新綁定到與您用來創建它的引用不同的引用。
這意味着您可以按照您的要求創建一個類似 object 的引用以供稍后使用。
這是一個最小的工作示例:
#include<functional>
#include<vector>
#include<cassert>
int main() {
int x;
std::reference_wrapper<int> w{x};
std::vector<int> vec{1, 2, 3};
w = vec[0];
w.get() = 42;
assert(vec[0] == 42);
}
再次,這是為了好奇。
我不建議你在你的代碼中這樣做(當然,除非你討厭你的同事)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.