草庐IT

c++ - 有意义的诊断信息

看了几个帖子,我觉得很多问题的出现是因为编译器/实现不会多次发出非常有意义的消息(但并非总是如此)。对于错误消息至少非常令人生畏的模板来说尤其如此。一个例子可能是discussiontopic因此,我想了解几点:a)为什么编译器有时无法提供更有意义/有用的错误消息?是纯粹的实际原因还是技术原因,还是有其他原因。(我没有编译器背景)b)为什么他们不能提供对最相关符合C++标准节/节的引用,以便开发人员社区可以更好地学习C++?编辑:引用线程here再举个例子。编辑:引用线程here再举个例子。 最佳答案 根本问题是编译器诊断会处理您没

c++ - 将 std::uninitialized_fill() 与任何分配器一起使用是否有意义?

用std::uninitialized_fill()初始化内存有意义吗?当用户作为参数传递的分配器已用于获取内存本身时,在库中?我问这个是因为分配器应该提供自己的construct()方法(allocate()方法除外),其实现可能与标准方法不同,因此可能是std::uninitialized_fill()并不总是适用于所有情况。准确的说,我的疑惑来自Stroustrup写的C++书(附录E“Standard-LibraryExceptionSafety”,E.3.1节),书中作者给出了一个templatevector::vector(size_typen,constT&val,con

c++ - 什么时候用 "class_name obj_name = func()"替换 "class_name obj_name{func()}"有意义?

在代码中我看到了以下结构:constclass_nameobj_name{func()};func()返回名为class_name的类的对象。所以,我想知道为什么不使用以下结构:constclass_nameobj_name=func(); 最佳答案 constclass_nameobj_name{func()};作者通过写上面的代码,试图遵循统一初始化语法(C++11引入),从而避免繁琐的解析和最令人烦恼的解析,即使是经验丰富的程序员也会意外陷入其中。他正试图将最佳实践灌输到他的大脑中,这样他就不会偶尔陷入上述解析问题,如下所述。

c++ - 静态多态性对实现接口(interface)有意义吗?

祝大家圣诞快乐!我正在学习静态多态性,并且正在阅读AndreiAlexandrescu关于基于策略的设计的优秀书籍。我在我的代码中遇到了以下情况:我有接口(interface)Interface指定方法Foo必须存在。该接口(interface)将由Impl类实现。我有以下两个选择:1)动态多态classInterface{public:virtualvoidFoo()=0;}classImpl:publicInterface{public:voidFoo(){};}2)静态多态classImpl{{public:voidFoo(){};}templateclassInterface:

c++ - 在可移动和不可复制的类上使用移动和交换习语是否有意义

如果我有一个类classFoo{public:Foo(){...}Foo(Foo&&rhs){...}operator=(Foorhs){swap(*this,rhs);}voidswap(Foo&rhs);private:Foo(constFoo&);//snip:swapcode};voidswap(Foo&lhs,Foo&rhs);如果我没有复制构造函数,按值和交换实现operator=是否有意义?它应该防止复制我的Foo类对象,但允许移动。此类不可复制,因此我不能复制构造或复制分配它。编辑我已经用它测试了我的代码,它似乎具有我想要的行为。#include#includeusin

c++ - 虚拟模板方法有意义吗?

假设这样一个结构:classInterface{public:templatevirtualvoidreportOperationError(Tcode,std::stringmessage)=0;};我不明白这个东西的用例,在什么情况下它有用,怎么用?如果你想知道,我在任何地方都没有看到这段代码,只是想了解这是否有一些特殊用途 最佳答案 模板化的成员函数不能是虚拟的...函数的每个实例化都会向虚拟表添加另一个条目,编译器将不得不遍历所有代码以创建vtable。因此,无论它是否有用,它都是不合法的C++。

c++ - 如何从任何可调用的对象中获取有意义的函数签名

考虑这样一个野兽:templatevoidregister_function(Funcfunc){//type-eraseFuncandpassitontosomeotherfunction}假设这可以传递任何可调用的东西。如果Func,我知道如何得到函数的签名是一个普通的函数类型。鉴于func可以是一个简单的函数,一个std::function,或一个函数对象(一个std::bind()表达式),我怎样才能得到函数的参数?注意:在这种情况下,函数只有零个、一个或两个参数如果它是一个函数对象,它就是std::bind()的结果需要签名才能获得参数的类型,这需要在传递的类型删除的事物中可

c++ - 是否应该敏锐而有意识地尝试尽可能长时间地推迟变量定义?

在他的书EffectiveC++ScottMeyers中提出了一个有趣的指南,项目26:尽可能推迟变量定义。它提高了程序的清晰度并提高了程序效率。他提出的支持上述论点的论点是,无论何时创建或销毁变量,我们都会为变量的构造和销毁产生一些成本。我们可能有多个控制流,其中我们可能从函数返回而不使用早期(在函数开头)定义的变量,因此可能不必要地产生创建未使用变量的成本。这一切似乎都是合乎逻辑的,而且确实是一个很好的做法。来自c背景的我倾向于在功能block的开头声明我的所有变量。也许这仅仅是c的背景,但我也觉得将所有声明放在一个函数的一个位置提供了简单和更好的可读性。所以问题是你们中有多少人在

c++ - 如何从命令行在 OSX 上的 callgrind 输出中获取有意义的函数名称?

目标:我希望能够分析callgrind(以及后来的cachegrind)的输出,并希望在使用callgrind_annotateCLI时看到有意义的变量名。先前研究:我知道Valgrind(http://valgrind.org/docs/manual/manual-core.html)中的dsym标志,并且相信我了解调试符号在osx(LLDBnotshowingsourcecode)上的工作方式。我在这个网站上看到的少数提到这个问题要么没有得到答复,要么是未包含-g标志的情况。理论(可能是错误的...):基于valgrind输出中的“dym=”行,我想知道valgrind是否正在努力

c++ - 使用 std::shared_ptr<std::vector> 而不是 boost::shared_array 有意义吗?

现在我正在重写部分代码以使用C++11标准。在某些地方我发现了以下代码:boost::shared_arrayarray;是否可以将其替换为:std::shared_ptr>array;我正在尝试在我的代码中替换C++11中已经存在的所有boost功能。我需要澄清一点。实际上我需要一个原始数组(但有引用计数,所以它可以自动删除),不需要所有那些vector特征。所以boost::shared_array解决了我想要的问题,没有任何额外的成本。但我试图让我的代码尽可能多地使用新标准(尽管新标准仍未涵盖来自boost的许多库)。谢谢。 最佳答案