C++ 调用构造函数而不将其分配给任何变量c++;

C++ 调用构造函数而不将其分配给任何变量c++;,c++,constructor,C++,Constructor,这可能是一个非常愚蠢的问题,但我甚至不知道应该写些什么来寻找答案。我甚至不确定我给的标题是否正确 如果我有这样一个构造函数: CError(const std::string& msg) { showMessage(msg) } 我想这样称呼它 CError("some message"); 。。。一切正常,但当在某个变量中指定字符串时,我得到一个错误“类CError的默认构造函数不存在”: 当我这样写的时候,它是有效的: std::string str = "some messag

这可能是一个非常愚蠢的问题,但我甚至不知道应该写些什么来寻找答案。我甚至不确定我给的标题是否正确

如果我有这样一个构造函数:

CError(const std::string& msg) { showMessage(msg) }
我想这样称呼它

CError("some message");
。。。一切正常,但当在某个变量中指定字符串时,我得到一个错误“类CError的默认构造函数不存在”:

当我这样写的时候,它是有效的:

std::string str = "some message";
CError err(str);
但我只是不需要这个
err
对象

谁能解释一下为什么我不能只调用构造函数本身

提前感谢您的回答。

CError(str)解析为
CError str
,它定义了一个新变量
str
。我的编译器以不同的方式失败,这使得问题更加明显:
用不同的类型重新定义'str'。

解决此问题的一个简单方法是强制转换对象:

(void)CError(str);
然而,最紧迫的问题是:为什么要这样做?如果您不打算以任何方式使用构造的对象,为什么不简单地使其成为一个静态成员函数,甚至只是一个普通的旧自由函数?

语句
CError(str)
被理解为定义类型为
CError
的对象
str
;它相当于
CError-str但名称
str
括在括号内

要解决这个问题,您还可以将类型名称括起来:
(CError)(str)。这将强制将语句解读为函数强制转换表达式;您可以等效地编写
(CError)str甚至<代码>静态播放(str)


在C++11中,可以使用通用初始化语法编写
CError{str}

的原因与您不能编写
int=5
int(5)
的原因相同?@singeroffall这真的是一样的吗?我更愿意说,您正在尝试将int类型的对象分配给类型本身,但我不-我只想创建一个对象,而不是访问它(因为我不需要它),我只需要调用构造函数,它为我显示MessageBox。正如我看到的,你实际上可以只写int(5)。不,
int=5
根本不是一回事
int(5)
,然而,它是合法的。这很奇怪,但实际上是有道理的!非常感谢您的回答。:-)是的,我将创建一个静态成员函数,但我只是好奇这个构造函数到底出了什么问题。@蚊子:我从来没有完全研究过C的声明语法。我通常会把这些奇怪的东西通过一两个编译器来弄清楚到底发生了什么。
(void)CError(str);