【问题标题】:how does std::string manages this trick?std::string 如何管理这个技巧?
【发布时间】:2012-02-18 20:42:11
【问题描述】:

我刚刚写了一个函数:

void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}

然后我用这个来称呼它

doSomeStuffWithTheString("foo");

它有效。所以我会认为这可以工作(一个 const char* 来初始化 std::string 的隐式实例)该值必须按值传递,但在这种情况下是通过 (const) 引用传递的。

当引用为 const 时,是否有可能从 const char* 实例化隐式时间 std::string?如果没有,那么这可能如何工作?

编辑

如果函数被重载了会发生什么

void doSomeStuffWithTheString(const char* value);

哪一个会选择编译器?

【问题讨论】:

  • 你几乎回答了你自己的问题:)
  • 有趣,不知道。一个对象需要什么,所以在 const-by-ref 调用上会发生这样的隐式构造函数(以及如何避免它?)
  • 程序格式错误:std::string = value; 无效,应该被编译器拒绝。
  • @lurscher:有关如何避免它,请参阅explicit 关键字。但是,您只能阻止您编写的类的隐式转换,所以我不知道是否有办法阻止 const char * => std::string 隐式转换。

标签: c++ pass-by-reference stdstring pass-by-const-reference


【解决方案1】:

“该值必须按值传递,但在这种情况下是通过 (const) 引用传递的。”

有一个 C++ 功能可以将临时值(在本例中为从 const char * 隐式转换的临时 std::string)传递给 const-reference 的参数(在本例中为 const std::string &amp; ) 类型。

【讨论】:

    【解决方案2】:

    没错,使用std::string默认构造函数

    【讨论】:

      【解决方案3】:

      std::string 类型具有来自const char* 的隐式转换(通过构造函数)。这就是允许字符串文字 "foo" 转换为 std::string 的原因。这会产生一个临时值。在 C++ 中,将 const &amp; 设置为临时值是合法的,因此这一切都保持在一起。

      可以在 C++ 中使用您自己的自定义类型复制此技巧。

      class Example {
      public:
        Example(const char* pValue) {}
      };
      
      void Method(const Example& e) {
        ...
      }
      
      Method("foo");
      

      【讨论】:

        【解决方案4】:

        是的,一个临时的std::string 是从字符串文字构造的。

        【讨论】:

          猜你喜欢
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          • 2010-10-14
          • 2021-08-03
          • 2016-03-01
          • 2011-03-16
          • 1970-01-01
          相关资源
          最近更新 更多