为什么我的编译器将字符串视为const char []?

Sup*_*135 1 c++ oop string

建设者

PixelPlane::PixelPlane(int& width, int& height, const std::string& label)
Run Code Online (Sandbox Code Playgroud)

每当我使用以下参数初始化对象时

PixelPlane pixel_plane(960, 540, "Title");
Run Code Online (Sandbox Code Playgroud)

Visual Studio在960参数下划线并显示消息No instance of constructor "PixelPlane::PixelPlane matches the argument list. Argument types are: (int, int, const char[5])。我看到有人做了类似的事情而没有错误https://www.youtube.com/watch?v=1nfuYMXjZsA。我做错了什么还是只是忽略了什么?

vso*_*tco 8

你逝去的右值小号(960和540)作为参数传递给需要的构造int&引用。这是禁止的。您可以将右值绑定到一个参考的唯一时间是基准标记时const,如const int&(或当你有一个转发参考 ;还参见Scott Meyers的优秀后(只需更换通用转发,因为这是这些引用是如何现在叫在C ++标准中))。

std::string具有从一个隐式转换const char*(构造函数#5中的链路)中,向其中所述const char[5]的类型label衰变到,因此该字符串的部分是确定。

顺便说一句,不要通过const引用传递基本类型。它不会保存任何内容,并且可能会阻止优化。const仅当要传递的对象的复制成本很高(或处理模板代码时,请参见@Mark的注释)时,才通过引用传递。就您而言,只需按值传递

PixelPlane::PixelPlane(int width, int height, const std::string& label)
Run Code Online (Sandbox Code Playgroud)