b***i 发帖数: 3043 | 1 【新问题】
4. boost::format的返回值是string吗,我应该用string&吗?
比如: std::string& str = boost::format(......);
std::cout<
throw ... (str);
这样可以省掉一个复制吧?
5. 类UUU的static函数里面
static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
...
就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
今天reviewer说要我改成把un放到类UUU这一层去,而不是在函数里面。这样就不能避
免启动问题了。而且很麻烦,因为不是简单的整数,浮点数等,是不知道怎么实现的类
(有头文件)。大家说我的做法对不对?另外我这样做是照着其他人写的抄的。有一个
人告诉我这样写好
6. 搜索rvalue reference variable,收到这么一个stackoverflow的问题
struct S { S(const S &) = delete; };
S f();
// S s = f(); // error: no copy or move constructor available
S&&s = f(); // okay
这上面第二行S f();是干啥的?
【老问题】
今天开始写一个新的类BB,继承一个基本的类B。有几个发现
1. 基类B无参数的构造函数(就是default构造函数吧)没有定义,所以子类是不是也应
该没有?还是可以有,看项目需要?
以前是用的子类AA:A,现在要基于B。两个基类有一些区别,也有共性。别人的例子
BBB:B是没有的。
2. 基类B delete拷贝构造函数,子类BB是否需要重写一遍delete?我看别人的例子子类
BBB写了。我如果不写子类BB的拷贝构造函数并delete,默认是delete吗?
3. BB& operator=(BB&& other) 是否需要判断等于自己?有的说既然是临时对象是不
可能等于自己的。甚至应该assert然后报错。而我看别人代码就是B的子类BBB的例子有
判断other是不是自己的代码。请问怎样做是对的? |
l*********s 发帖数: 5409 | |
L****8 发帖数: 3938 | 3 delete拷贝构造函数 是个啥东西?
BB& operator=(BB&& other)
如果 other 是自己 return 自己
不需要报错,最多写个warning信息 用于debug
【在 b***i 的大作中提到】 : 【新问题】 : 4. boost::format的返回值是string吗,我应该用string&吗? : 比如: std::string& str = boost::format(......); : std::cout<: throw ... (str); : 这样可以省掉一个复制吧? : 5. 类UUU的static函数里面 : static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},}; : ... : 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
|
b***i 发帖数: 3043 | 4 4. boost::format的返回值是string吗,我应该用string&吗?
比如: std::string& str = boost::format(......);
std::cout<
throw ... (str);
这样可以省掉一个复制吧?
5. 类UUU的static函数里面
static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},};
...
就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
今天reviewer说要我改成把un放到类UUU这一层去,而不是在函数里面。这样就不能避
免启动问题了。而且很麻烦,因为不是简单的整数,浮点数等,是不知道怎么实现的类
(有头文件)。大家说我的做法对不对?另外我这样做是照着其他人写的抄的。有一个
人告诉我这样写好。
【在 b***i 的大作中提到】 : 【新问题】 : 4. boost::format的返回值是string吗,我应该用string&吗? : 比如: std::string& str = boost::format(......); : std::cout<: throw ... (str); : 这样可以省掉一个复制吧? : 5. 类UUU的static函数里面 : static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},}; : ... : 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺
|
w***g 发帖数: 5958 | 5 据我的理解, 4的写法是错的. 应该是 string str = boost::format(...).
str = 翻译出来是一个rvalue copy constructor, 应该直接用swap优化了.
考。
【在 b***i 的大作中提到】 : 4. boost::format的返回值是string吗,我应该用string&吗? : 比如: std::string& str = boost::format(......); : std::cout<: throw ... (str); : 这样可以省掉一个复制吧? : 5. 类UUU的static函数里面 : static std::map un= {{c1, &DD:DDDD1()}, {c2, &DD:DDDD2()},}; : ... : 就是说,一个静态变量定义在函数里面。我想可以避免程序启动时各个编译单元启动顺 : 序的问题。这里的DD:DDDD1()就是一个库里面DD类的static函数,返回一个变量的参考。
|
b***i 发帖数: 3043 | 6 右边肯定是个临时的字符串。但是,参考是没有问题的,变量会延长参考的生命。
另外我想是否需要左边上const
const string& str = boost::format() .str();
【在 w***g 的大作中提到】 : 据我的理解, 4的写法是错的. 应该是 string str = boost::format(...). : str = 翻译出来是一个rvalue copy constructor, 应该直接用swap优化了. : : 考。
|
w***g 发帖数: 5958 | 7 It is not allowed to bind the temporary to a non-const reference, but if you
make your reference const you will extend the lifetime of the temporary to
the reference.
【在 b***i 的大作中提到】 : 右边肯定是个临时的字符串。但是,参考是没有问题的,变量会延长参考的生命。 : 另外我想是否需要左边上const : const string& str = boost::format() .str();
|
b***i 发帖数: 3043 | 8 这样行不行
void someFunc(){
std::string&& errorMessage = boost::format("...").str();
std::cout<
LOG
}
就在这个函数里面用这个变量
you
to
【在 w***g 的大作中提到】 : It is not allowed to bind the temporary to a non-const reference, but if you : make your reference const you will extend the lifetime of the temporary to : the reference.
|
w***g 发帖数: 5958 | 9 I don't know. But even if this works, it won't have any significant
performance again anyway. The correct way of writing this should be:
string msg = boost::format("").str();
The point of inventing && is not for you to be able to write
string &&msg =,
Rather, it's for library writers to be able to writing
string::string (string &&) { ...},
or
string::operator = (string &&) { ...},
so that when you write "string msg = " it's as efficient as can be.
【在 b***i 的大作中提到】 : 这样行不行 : void someFunc(){ : std::string&& errorMessage = boost::format("...").str(); : std::cout<: LOG: } : 就在这个函数里面用这个变量 : : you : to
|
b***i 发帖数: 3043 | 10 我觉得应该是
auto&& errorMessage = boost::format("").str();
据说连constness也保持了。
【在 w***g 的大作中提到】 : I don't know. But even if this works, it won't have any significant : performance again anyway. The correct way of writing this should be: : string msg = boost::format("").str(); : The point of inventing && is not for you to be able to write : string &&msg =, : Rather, it's for library writers to be able to writing : string::string (string &&) { ...}, : or : string::operator = (string &&) { ...}, : so that when you write "string msg = " it's as efficient as can be.
|
L****8 发帖数: 3938 | 11 const auto&
【在 b***i 的大作中提到】 : 我觉得应该是 : auto&& errorMessage = boost::format("").str(); : 据说连constness也保持了。
|