有什么理由不将参数作为a const &而不是值发送,当它不会被更改并且不会复制时?我的理解是,constby value参数与没有const(并且不会相互重载)相同,因此它仍然会被复制.
我知道最好发送大型对象const &,但我不知道这条线的位置.或者,如果即使是很小的参数应该由值被发送,如果他们将不会改变或复制.
注意::我试图搜索这个,但主题相当模糊,所以我没有找到任何好的答案,我道歉,如果已经回答了这个问题(发现许多问题关于何时使用const何时使用const &但不是关于价值vs的优点const &对于不明显大的物体).
我有一个类,它基本上是一个double的包装器,允许它的值被强制为静态值:
class ModelParameter
{
protected:
double val;
bool isForced;
double forcedVal;
public:
ModelParameter(void);
ModelParameter(double value);
double getValue(void);
void setValue(double value);
bool getIsForced(void);
void forceValue(double value);
void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)
但我希望能够将它用于任何原始类型,而不仅仅是双打.如果我像这样重新定义它:
template <class T>
class ModelParameter
{
protected:
T val;
bool isForced;
T forcedVal;
public:
ModelParameter(void);
ModelParameter(T value);
T getValue(void);
void setValue(T value);
bool getIsForced(void);
void forceValue(T value);
void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)
这意味着可以使用任何类型,无论它是否是原始的.有没有什么办法可以限制模板中使用的类型只使用原始类型?
假设我有这两个std::vector:
std::vector<int> v_int(1000);
std::vector<T> v_T(1000); // Where T is copy-costy type
Run Code Online (Sandbox Code Playgroud)
如果我需要循环浏览它们(不需要)而不需要编辑我可能使用的项目:
for(const auto item:v_int){
//...
}
for(const auto& item:v_T){ //Note &
//...
}
Run Code Online (Sandbox Code Playgroud)
迭代使用const auto item:v_T太糟糕了,因为每次迭代都会执行一次复制.然而,使用const auto& item:v_int不是最佳但不是那么糟糕.因此,如果我需要一个处理它们的代码我曾经使用过const auto& item:v.
问题:是否有一种通用的方法来编写将为它们使用最佳声明的for循环?就像是:
template <typename T>
void iterate(const std::vector<T> v){
for(const auto/*&*/ item:v){ // activate & if T is not elementary type
//...
}
}
Run Code Online (Sandbox Code Playgroud) 在专业类模板,我想有一个专业化的目标完全成熟的类(完整的构造函数,析构函数等)和一个专业化的目标原语(int,float,等).我见过的唯一部分专业化是针对指针类型(via T*).有没有办法做到这一点?