隐式可转换参数,但为 ref 类型
Implicitly convertible argument, but of ref type
#include <iostream>
#include <string>
void foo(const std::string & s)
{
std::cout << s;
}
const char * text = "something";
int main()
{
foo( text );
}
我开始想知道这里发生了什么,因为 gdb
报告 s == ""
。根据标准的最新版本(比如 C++17
)应该发生什么?
通过 https://godbolt.org/
我可以看到一个 std::string
c-tor,所以也许一个是通过引用构造和传递的,然后在函数终止时销毁。
class模板std::basic_string
有隐式转换构造函数
basic_string(const charT* s, const Allocator& a = Allocator());
所以在这次通话中
foo( text );
创建了一个 std::string
类型的临时对象,并将对它的引用用作函数参数的初始值设定项。在此语句结束时,临时对象被销毁。
这是一个演示程序,它使用示例 class.
展示了引擎盖下发生的事情
#include <iostream>
class String
{
private:
const char *s;
public:
String( const char *s ) :s( s )
{
std::cout << "String( const char * ) is called\n";
}
~String()
{
std::cout << "~String() is called\n";
}
friend std::ostream & operator <<( std::ostream &os, const String & s )
{
return os << s.s;
}
};
void foo( const String & s )
{
std::cout << s << '\n';
}
const char * text = "something";
int main()
{
foo( text );
}
程序输出为
String( const char * ) is called
something
~String() is called
如果使用函数说明符 explicit
声明构造函数,程序将无法运行。
explicit String( const char *s ) :s( s )
{
std::cout << "String( const char * ) is called\n";
}
要使程序运行,您需要显式调用构造函数。例如
foo( String( text ) );
#include <iostream>
#include <string>
void foo(const std::string & s)
{
std::cout << s;
}
const char * text = "something";
int main()
{
foo( text );
}
我开始想知道这里发生了什么,因为 gdb
报告 s == ""
。根据标准的最新版本(比如 C++17
)应该发生什么?
通过 https://godbolt.org/
我可以看到一个 std::string
c-tor,所以也许一个是通过引用构造和传递的,然后在函数终止时销毁。
class模板std::basic_string
有隐式转换构造函数
basic_string(const charT* s, const Allocator& a = Allocator());
所以在这次通话中
foo( text );
创建了一个 std::string
类型的临时对象,并将对它的引用用作函数参数的初始值设定项。在此语句结束时,临时对象被销毁。
这是一个演示程序,它使用示例 class.
展示了引擎盖下发生的事情#include <iostream>
class String
{
private:
const char *s;
public:
String( const char *s ) :s( s )
{
std::cout << "String( const char * ) is called\n";
}
~String()
{
std::cout << "~String() is called\n";
}
friend std::ostream & operator <<( std::ostream &os, const String & s )
{
return os << s.s;
}
};
void foo( const String & s )
{
std::cout << s << '\n';
}
const char * text = "something";
int main()
{
foo( text );
}
程序输出为
String( const char * ) is called
something
~String() is called
如果使用函数说明符 explicit
声明构造函数,程序将无法运行。
explicit String( const char *s ) :s( s )
{
std::cout << "String( const char * ) is called\n";
}
要使程序运行,您需要显式调用构造函数。例如
foo( String( text ) );