避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数

Avoid double-calling function in string assignment in ctor initializer list

本文关键字:赋值 字符串 函数 调用 列表 ctor      更新时间:2023-10-16

在下面的代码示例中,我想使用函数(可能返回NULL(或const char*的返回值初始化A初始值设定项列表中的std::string A::str_。但我不喜欢Func()被叫两次的事实。

#include <iostream>
const char* Func()
{
  char* p = NULL;
  // Assign p: may be NULL or non-NULL
  return p;
}
class A
{
public:
  A() : str_( Func() ? Func() : "NULL" ) {}
  std::string str_;
};
int main( int argc, char* argv[] )
{
  A a;
  std::cout << a.str_ << std::endl;
  return 0;
}

我想做这样的事情:

A() : str_( ( const char*& tmp = Func() ) ? tmp : "NULL" ) {}

但是以这种方式使用临时变量 - 甚至是引用,来延长它们的寿命 - 似乎是非法的(根据我目前的理解(。

是否有 C++03 语法允许初始化初始值设定项列表中的A::str_,仅调用Func()一次,而不使用全局/静态变量?如果有使用临时变量的解决方案,我想学习它的语法。

在 C++11 中使用委托构造函数

class A
{
private:
    A(const char* s) str_(s ? s : "NULL") {}
public:
  A() : A(Func()) {}
  std::string str_;
};

在 c++03 中,创建一个函数帮助程序

class A
{
private:
    static const char* FuncNotNull() { const char* s = Func(); return s ? s : "NULL"); }
public:
  A() : str_(FuncNotNull()) {}
  std::string str_;
};

这里有一个"滥用"lambda表达式的解决方案:

A() : str_( ([]()->const char*{ const char* p=Func(); return (p ? p : "NULL"); })() ) {}

我实际上投票支持Jarod的答案。但是我发现lambda的东西很丑,我也想展示它:-(