使用具有多态性的引用时初始化无效
invalid initialization when using references with polymorphism
我在处理一个项目时偶然发现了一个奇怪的编译器错误。我设法用这个小代码重现错误
#include <iostream>
class base
{
private:
char f;
public:
char get_char()
{
return f;
}
base(char f)
{
this->f = f;
}
};
class derived : public base
{
private:
std::string msg;
public:
const std::string &get_message() const
{
return msg;
}
derived(const std::string& msg) : base(msg.c_str()[0])
{
this->msg = msg;
}
};
void print_base(base &base_obj)
{
std::cout << base_obj.get_char() << std::endl;
}
const char *input = "Hello World!";
int main(int argc, char* argv[])
{
// This line compiles
//derived d = derived(std::string(argv[0]));
// This also works
//derived d(argv[0]);
// This line gives compiler error (see below)
derived d(std::string(argv[0]));
print_base(d);
return 0;
}
不起作用的行给了我编译器错误:
ain.cpp: In function ‘int main(int, char**)’:
main.cpp:50:17: error: invalid initialization of non-const reference of type ‘base&’ from an rvalue of type ‘derived (*)(std::string*) {aka derived (*)(std::basic_string<char>*)}’
print_base(d);
^
main.cpp:34:6: error: in passing argument 1 of ‘void print_base(base&)’
void print_base(base &base_obj)
为什么第二种初始化方式不编译?
附加信息:
编译器:g++
derived d(std::string(argv[0]));
声明一个名为d
的函数,该函数将指向std::string
的指针作为参数。这是最令人烦恼的解析之一,因为它做了一些看起来不应该做的事情
derived d(std::string* argv);
要解决此问题,请省略显式字符串构造,或者使用大括号或双圆括号。
derived d(argv[0]);
或
derived d{std::string(argv[0])}; // C++11
或
derived d((std::string(argv[0])));
错误消息中的线索是:
from an rvalue of type ‘derived (*)(std::string*)
并表示您正遭受C++最麻烦的解析
derived d(std::string(argv[0])); //function declaration (your code!)
相当于:
derived d(std::string argv[0]);
它是一个函数声明(而不是对象声明)。
使用统一的初始化语法来避免这样的问题:
derived d { std::string(argv[0]) }; //object declaration
希望能有所帮助。
相关文章:
- C++-模板嵌套类的引用初始化无效
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 类型为"短整型 (&)"的引用初始化无效
- 引用初始化和常量表达式
- 在Visual Studio 2013中为rvalue引用初始化捕获
- 从大括号括起来的初始值设定项列表进行的Lvalue引用初始化无法编译
- Visual C++ 2015 中右值的非常量引用初始化无效
- 是否可以使用对派生类实例的基类引用初始化派生类引用
- 类型'int&'的引用初始化无效,传递参数 1 时出错
- 引用初始化表单
- 从类型为"int*"的临时引用初始化类型为"int&"的非常量引用无效
- 简单的C++日志记录类-ostream引用初始化
- 错误:类型为"cv::Mat&"的非常量引用初始化无效
- 为什么我收到类型为"const vec&"的引用初始化无效
- 从类型为"char*"的临时引用初始化类型为"char*&"的非常量引用
- 为什么这会发送一个关于引用初始化无效的错误
- 为什么此处不对引用初始化执行复制初始化?
- std::vector不会为多个向量条目创建cv::Mat的新引用——初始化矩阵时,数据会被覆盖