我有一些关于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