为什么我需要在参数中添加 const?
Why do I need to add const to the argument?
我有这个功能:
void
SpookyBoy( bool Troublemaker, const Glib::ustring& name, HorrorPunkBand& band );
如果我删除 const
这个词,我会得到这个错误:
no known conversion for argument 2 from ‘const char [5]’ to ‘Glib::ustring&’
我只是想知道编译器是做什么的,有人可以向我解释为什么编译器可以使用 const
这个词吗?
即使我不得不承认这两个问题对于已经知道答案的人来说是相似的(在 fortiori),但对于还不知道答案的人来说肯定不是(在 priori)。
您显然是在使用字符串文字作为参数调用您的函数
SpookyBoy(..., "1234", ...);
编译器可以将字符串文字(在本例中的类型为 const char [5]
)隐式转换为类型 Glib::ustring
。但是隐式转换的结果是一个 临时对象 。在 C++ 语言中,只有 const 左值引用可以绑定到临时对象。非常量引用不能绑定到临时对象。
如果函数声明中没有 const
,您必须将函数调用为
Glib::ustring name("1234");
SpookyBoy(..., name, ...);
即通过显式引入 Glib::ustring
类型的命名对象并将其作为参数传递。
P.S。另见 Why const for implicit conversion?
我有这个功能:
void
SpookyBoy( bool Troublemaker, const Glib::ustring& name, HorrorPunkBand& band );
如果我删除 const
这个词,我会得到这个错误:
no known conversion for argument 2 from ‘const char [5]’ to ‘Glib::ustring&’
我只是想知道编译器是做什么的,有人可以向我解释为什么编译器可以使用 const
这个词吗?
即使我不得不承认这两个问题对于已经知道答案的人来说是相似的(在 fortiori),但对于还不知道答案的人来说肯定不是(在 priori)。
您显然是在使用字符串文字作为参数调用您的函数
SpookyBoy(..., "1234", ...);
编译器可以将字符串文字(在本例中的类型为 const char [5]
)隐式转换为类型 Glib::ustring
。但是隐式转换的结果是一个 临时对象 。在 C++ 语言中,只有 const 左值引用可以绑定到临时对象。非常量引用不能绑定到临时对象。
如果函数声明中没有 const
,您必须将函数调用为
Glib::ustring name("1234");
SpookyBoy(..., name, ...);
即通过显式引入 Glib::ustring
类型的命名对象并将其作为参数传递。
P.S。另见 Why const for implicit conversion?