避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数
Avoid double-calling function in string assignment in ctor initializer list
在下面的代码示例中,我想使用函数(可能返回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的东西很丑,我也想展示它:-(
相关文章:
- cin >> int 给定一个字符串将 int 赋值为 0
- Qt PL/SQL - 赋值运算符 - 字符串缓冲区太小
- 对函数的 out 字符串参数使用 swap 与赋值
- 在C++中用字符串数组拆分声明和赋值
- 字符串 c++ 的不明确整数赋值
- 如何使用向量为字符串赋值
- 避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数
- 在 c++ 中为字符串变量赋值
- C字符串到宽C字符串的赋值
- 无法为字符串赋值(Eclipse CDT、MinGW、C++)
- 包含字符串值的结构在使用动态内存分配创建后进行赋值时会导致分段错误
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- 复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)
- 为字符串指针赋值
- C++-将null赋值给std::字符串
- 如果我分配给彼此的两个变量都是字符串类型,为什么我会收到这个strcpy赋值错误
- 字符串的C++向量,为什么赋值会导致相同的字符引用
- 如何防止从字符串派生的 2 个类之间的交叉赋值
- 提升::任何赋值字符串值
- 如何在c++中使用指针赋值字符串向量的向量