避免在ctor初始化列表

时间:2017-04-06 20:00:10

标签: c++ ctor-initializer

在下面的代码示例中,我想在std::string A::str_的初始化列表中初始化A,其中包含函数的返回值(可能返回NULL)或者{ {1}}。但我不喜欢const char*被调用两次的事实。

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;
}

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

是否有C ++ 03语法允许在初始化列表中初始化A() : str_( ( const char*& tmp = Func() ) ? tmp : "NULL" ) {} ,仅调用A::str_一次,而不使用全局/静态变量?如果有一个使用临时变量的解决方案,我想学习它的语法。

2 个答案:

答案 0 :(得分:4)

在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_;
};

答案 1 :(得分:1)

这是一个解决方案,其中lambda表达式被滥用&#34;:

{}1

我实际上投了Jarod的答案。 但是我发现那个丑陋的lambda东西我也想表现出来: - )