我正在尝试创建一个类,其对象必须包含其值表示的简短描述("名称").因此,唯一的公共构造函数应该将一个字符串作为参数.
但是,对于操作,我需要创建临时(无相关名称)对象来计算要分配给现有对象的值.为此,我实现了一个私有构造函数,不应该直接或间接地使用它来实例化一个新对象 - 这些临时对象应该只通过operator =分配给一个已经存在的对象,它只复制值而不是名称和价值.
问题来自于使用"自动".如果新变量声明如下:
auto newObj = obj + obj;
Run Code Online (Sandbox Code Playgroud)
编译器推导出operator +的返回类型,并直接将其结果赋值给newObj.这会导致对象具有不相关的名称,这不应该是实例化的.
此外,从某些功能仍然可以推断出已存在对象的类型,例如:
auto newObj = obj.makeNewObjWithSameTypeButOtherName("Other name");
Run Code Online (Sandbox Code Playgroud)
按照展示问题的代码:
#include <iostream>
#include <string>
using namespace std;
template<class T>
class Sample
{
public:
Sample(const string&);
Sample<T> makeNewObj(const string&);
// Invalid constructors
Sample();
Sample(const Sample&);
void operator=(const Sample&);
void operator=(const T&);
Sample<T> operator+(const Sample&) const;
void show(void);
private:
// Private constructor used during operations
Sample(const T&);
T _value;
string _name;
};
template<class T>
Sample<T>::Sample(const string& name)
{
this->_name …Run Code Online (Sandbox Code Playgroud)