gpt4 book ai didi

c++ - 模板代码中的统一初始化

转载 作者:行者123 更新时间:2023-11-28 05:46:12 25 4
gpt4 key购买 nike

<分区>

据我所知,uniform initialization是初始化对象的首选语法。赫伯萨特 writes

For one thing, it’s called “uniform initialization” because it’s, well, uniform—the same for all types, including aggregate structs and arrays and std:: containers...

以及对 this question 的接受答案州

Prefer {} initialization over alternatives unless you have a strong reason not to.

但是,请考虑以下代码:

#define BRACES                                                                                                                                                                                           

template<typename V>
class foo {
public:
template<typename W>
explicit foo(const W &w) :
#ifdef BRACES
m_v{w}
#else // #ifdef BRACES
m_v(w)
#endif // #ifdef BRACES
{}

private:
V m_v;
};

struct bar{};

int main()
{
bar b;

foo<bar>{b};
#ifdef BRACES
bar c{b};
#else // #ifdef BRACES
bar c(b);
#endif // #ifdef BRACES
}

如果 #define BRACES 未被注释,此代码将无法构建 (g++ 4.8.5) 并出现 错误:'bar' 的初始值设定项太多 在线

    m_v{w}

foo 的构造函数中。这是有道理的,因为更直接的调用

 bar c{b};

main 中的失败类似,它们本质上是相同的(尽管模板代码不知道这一点)。

相反,注释 #define BRACES 会导致构建所有内容。这是否表明要在此类模板代码中避免这种形式的初始化?

编辑

@melak47指出这个问题在g++5.1中没有出现,给了convincing proof .它显然在 4.8.5 和 5.1 之间的某个地方消失了。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com