- 主题:这个怎么理解?
absl不是不建议用花括号,而是说在当做container批量初始化的时候用花括号,在呼叫构造函数的时候用小括号。
【 在 here080 的大作中提到: 】
: 错了,absl的建议风格是不要用花括号。
: 变成函数声明需要没有参数。没有参数时有别的写法。而且变成函数声明是编译错误,不是大问题。
:
--
FROM 115.193.174.*
我个人觉得{}在很大程度上是给模板用的
基本上来说,如果人肉显式区别{}和(),那基本上{}是填充内存,初始化aggregates的。()基本上是把ctor当成一个builder函数。这个区别可能是在机器代码层面的,具体的我不清楚,可能初始化内存可以在编译时搞定,呼叫builder函数就是运行时?大概
但是一旦涉及模板,如果{}不能兼容()的话,那在模板中构造object的时候,还需要区分这个object到底是不是aggregates,然后再选择对应的{}或者(),那就很麻烦了,所以{}需要兼容()
cpp很多新东西,如果放在模板和编译器优化上来看,就比较清楚了
【 在 here080 的大作中提到: 】
: 没错。
: int x = 3;
: vector<int> = {1,2,3};
: ...................
--
FROM 115.193.191.*
我的意思是,一个模板,你怎么在模板里知道传入的typename T是不是aggregates
template<typename T, typename ...ArgsT>
T some_builder_tempalte(ArgsT args...)
{
return T{args...};
}
【 在 here080 的大作中提到: 】
: 模板中不控制区分aggregates还是ctor? 这样模板有点危险吧?
: 反正我写代码aggregates一般都是 = {...},前面这个等号一加意思就非常清楚了。
:
--
FROM 115.193.191.*
这是很正常的需求
比如,计算面积, T是存几何体定义的结构,可能是简单的aggregates,可能是复杂的拓扑结构,如果是三角形,就是简单三个点的坐标,初始化T,显然用{}。如果是复杂的,比如说椭圆之类,是用圆心+半径之类经过计算定义的,那就是ctor,用(),如果{}不兼容(),那这个模板就很复杂了。
template<typename T, typename ...ArgT>
constexpr int AreaSize(ArgT args...)
{
return T{args...}.area();
}
【 在 here080 的大作中提到: 】
: 这种需求本身有问题。你不妨举一个具体一点的例子?
:
--
FROM 115.193.191.*