草庐IT

c++ - 在另一个类的构造函数的成员初始化程序中声明的类在它之外是否可见?

考虑以下代码:structFoo{void*p;Foo():p{(classBar*)0}{}};Bar*bar;最新版本的GCC(8.2)和Clang(7.0.0)编译失败。ICC(19.0.1)也是如此。但是MSVC(v19.16)可以干净地编译它。来自GCC的错误是:error:'Bar'doesnotnameatype;你是说'char'吗?Clang和ICC发出类似的消息。allfourcompilersatgodbolt的一致性查看器.那么根据标准,哪个编译器是正确的? 最佳答案 [basic.lookup.elab].

c++ - 在另一个类的构造函数的成员初始化程序中声明的类在它之外是否可见?

考虑以下代码:structFoo{void*p;Foo():p{(classBar*)0}{}};Bar*bar;最新版本的GCC(8.2)和Clang(7.0.0)编译失败。ICC(19.0.1)也是如此。但是MSVC(v19.16)可以干净地编译它。来自GCC的错误是:error:'Bar'doesnotnameatype;你是说'char'吗?Clang和ICC发出类似的消息。allfourcompilersatgodbolt的一致性查看器.那么根据标准,哪个编译器是正确的? 最佳答案 [basic.lookup.elab].

c++ - 将 unique_ptr 添加到 vector 中的类会导致 3 倍 boost

背景我有一个大图(100k个节点),其中每个节点必须为每个出边存储一些信息。而不是将其保存在std::vector中,我正在使用dynamic_bitset从Boost1.58开始,可以执行按位运算。每个节点还保留一个指向某个多态对象的指针。一个最小的例子看起来像这样,structNode{std::vectorsucc;boost::dynamic_bitsetsucc_flags;std::unique_ptrdata;};问题考虑这个简单的基准程序,它创建和销毁一个图:#include#include#includeconstexprintN=50000;structNode{s

c++ - 将 unique_ptr 添加到 vector 中的类会导致 3 倍 boost

背景我有一个大图(100k个节点),其中每个节点必须为每个出边存储一些信息。而不是将其保存在std::vector中,我正在使用dynamic_bitset从Boost1.58开始,可以执行按位运算。每个节点还保留一个指向某个多态对象的指针。一个最小的例子看起来像这样,structNode{std::vectorsucc;boost::dynamic_bitsetsucc_flags;std::unique_ptrdata;};问题考虑这个简单的基准程序,它创建和销毁一个图:#include#include#includeconstexprintN=50000;structNode{s

c++ - 如何让人们相信一个有 11975 行代码的类是不好的? (不是吗?)

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭7年前。Improvethisquestion阅读[Whattodoabouta11000linesC++sourcefile?]时有一种似曾相识的感觉发布,但我认为我不能自己开始采取行动,因为我无权采取行动。所以我认为第一步是让组织中的人相信大块代码是不好的。我有一个类似的情况,有一个类有11975行代码,每次有新的特性,这个类很有可能会越来越大。 最佳答案 你有我的同情。任何如

c++ - 如何让人们相信一个有 11975 行代码的类是不好的? (不是吗?)

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭7年前。Improvethisquestion阅读[Whattodoabouta11000linesC++sourcefile?]时有一种似曾相识的感觉发布,但我认为我不能自己开始采取行动,因为我无权采取行动。所以我认为第一步是让组织中的人相信大块代码是不好的。我有一个类似的情况,有一个类有11975行代码,每次有新的特性,这个类很有可能会越来越大。 最佳答案 你有我的同情。任何如

C++11: "= {}"的类内初始化不适用于显式构造函数

在C++11中,我们可以使用“brace-or-equal-initializer”(标准中的词)进行类内初始化,如下所示:structFoo{/*explicit*/Foo(int){}};structBar{Foofoo={42};};但是如果我们取消注释explicit,它就不再编译了。GCC4.7和4.9是这样说的:error:convertingto‘Foo’frominitializerlistwoulduseexplicitconstructor‘Foo::Foo(int)’我觉得这很令人惊讶。这段代码不编译真的是C++11标准的本意吗?删除=修复它:Foofoo{42}

C++11: "= {}"的类内初始化不适用于显式构造函数

在C++11中,我们可以使用“brace-or-equal-initializer”(标准中的词)进行类内初始化,如下所示:structFoo{/*explicit*/Foo(int){}};structBar{Foofoo={42};};但是如果我们取消注释explicit,它就不再编译了。GCC4.7和4.9是这样说的:error:convertingto‘Foo’frominitializerlistwoulduseexplicitconstructor‘Foo::Foo(int)’我觉得这很令人惊讶。这段代码不编译真的是C++11标准的本意吗?删除=修复它:Foofoo{42}

c++ - 为什么虚拟基类必须由最派生的类来构造?

以下代码无法编译:classA{public:A(int){}};classB:virtualpublicA{public:B():A(0){}};//mostderivedclassclassC:publicB{public:C(){}//wrong!!!};如果我在C的构造函数初始化列表中调用A的构造函数,即://mostderivedclassclassC:publicB{public:C():A(0){}//OK!!!};确实有效。显然,原因是因为虚拟基类必须始终由大多数派生类构造。我不明白这个限制背后的原因。 最佳答案 因

c++ - 为什么虚拟基类必须由最派生的类来构造?

以下代码无法编译:classA{public:A(int){}};classB:virtualpublicA{public:B():A(0){}};//mostderivedclassclassC:publicB{public:C(){}//wrong!!!};如果我在C的构造函数初始化列表中调用A的构造函数,即://mostderivedclassclassC:publicB{public:C():A(0){}//OK!!!};确实有效。显然,原因是因为虚拟基类必须始终由大多数派生类构造。我不明白这个限制背后的原因。 最佳答案 因