我有一些關於returing類成員變量引用的問題。C++通過引用返回並通過const引用值返回被複制
我有以下代碼:
#include <stdint.h>
#include <string>
#include <iostream>
#include <set>
void
PrintSet (const std::string & str, const std::set<uint32_t> & to_print)
{
std::cout << str << " (" << to_print.size() << "): ";
for (std::set<uint32_t>::const_iterator it = to_print.begin();
it != to_print.end(); ++it)
{
std::cout << *it << " ";
}
std::cout << "\n";
}
class Test
{
private:
std::set<uint32_t> m_values;
public:
Test() : m_values() { }
void
SetValues (const std::set<uint32_t> & values)
{
m_values = values;
}
const std::set<uint32_t> &
GetValues() const
{
return m_values;
}
std::set<uint32_t> &
GetValues()
{
return m_values;
}
void
Print() const
{
PrintSet ("TestInst", m_values);
}
};
我注意到,如果我這樣做:
std::set<uint32_t> returned = test.GetValues();
變量
returned
得到一個副本,而不是一個參考,爲什麼呢?是否
const std::set<uint32_t> & GetValues() const
功能必須包含雙const
(一個在返回值和函數名後的)?
編輯:其他問題:
明知
std::set<uint32_t> returned = test.GetValues();
創建一個副本。如果我這樣做:test.GetValues().size();
爲了調用
size()
函數(或返回對象的任何其他成員),是一份臨時創建或全部與返回的參考解決?有三個函數,通過const引用和通過引用返回值是不是很糟糕?
// Return by value std::set<uint32_t> GetValues() const { return m_values; } // Return by const-reference const std::set<uint32_t> & GetValues() const { return m_values; } // Return by reference std::set<uint32_t> & GetValues() { return m_values; }
的副本不會在發生調用這兩個函數之間的歧義返回按引用;該副本是因爲「返回」不是參考。 – user2357112
'returned'不是引用,因爲你自己明確聲明它是'std :: set',這不是引用。 –
AnT