草庐IT

C++这里调用的是拷贝构造函数吗?

假设你有这样一个函数:Foofoo(){Foofoo;//morelinesofcodereturnfoo;//isthecopyconstructorcalledhere?}Foobar(){//morelinesofcodereturnFoo();//isthecopyconstructorcalledhere?}intmain(){Fooa=foo();Foob=bar();}当任何函数返回时,复制构造函数是否被调用(假设会有一个)? 最佳答案 它可能会被调用,也可能不会被调用。在这两种情况下,编译器都可以选择使用返回值优化(

c++ - 为什么模板类的静态成员不是唯一的

看看下面的代码:#includetemplateclassFoo{public:staticTbar;};templatetypenameTFoo::bar;intmain(){std::cout::bar:"::bar::bar:"::bar这将打印出2个不同的地址。我能理解为什么在这种情况下,bar类型为T并因此在Foo中实例化了不同的T会给你不同的静态成员。然而,如果我们改变bar到我们已经知道的类型(例如staticintbar)这个stillhappens.为什么会这样?为什么不重复使用bar对于多个模板实例化?我怎么才能得到1bar贯穿不同实例化的对象?

c++ - 在 C++11/14 中说 "foo not in {bar, baz}"的漂亮方式

我正在编写C++,但缺少Python的清晰度。但我知道C++一直在发展,我想知道是否有更好的方法来做这样的事情:if(foo!=bar&&foo!=baz)在Python中我会这样做:iffoonotin{bar,baz}:C++11或C++14中是否有一个奇特的特性允许我做一些类似可读的事情?编辑:很多人想知道为什么我要尝试替换这么短的东西。我不是,但我不想让我的示例像原始代码一样丑陋和不可读。它更像是:if(somelongvariablename.somelongmethodname()!=SomeReallyLongNamespace::AndAnotherSubClassna

c++ - C++中的困惑

我是C++的新手,目前正在学习它。我有几个问题..voidDoSomething(constFoo&foo)和voidDoSomething(Foofoo)之间有什么区别?如果我们不指定&那么实例Foo的将按值传递(而不是引用)。除了在编译时不检查外,它与在参数中使用const+&相同。那么,为什么有const+&成为没有&和const的争论的最佳实践?在C#中,传递对象是“通过引用”,但似乎不是在C++中。我正在读的书说成员函数通过引用传递隐式参数..谁能给我隐式参数的样本和引用?我知道如果我们想通过引用传递对象,我们需要使用&(例如Foo(Person&p))但是C++是如何通过引

c++ - 具有静态变量的递归函数

我有一个带有静态变量“count”的递归函数。该函数递归递增计数,并且由于它具有文件范围,当我第二次调用foo()时,计数仍然等于5。是否有一种技术可以在第二次调用foo()之前将计数重置为0?基本上,我不希望count具有文件范围,但我希望它在不同的迭代中保留其值。我能想到的一种方法是在foo()中有一个参数来初始化foo()。如foo(intcount)。但是还有别的办法吗?#includeusingnamespacestd;voidfoo(){staticintcount=0;if(count5" 最佳答案 更惯用的方法是将其

c++ - 为什么 C++ 编译器无法将 "if(test) --foo"优化为 "foo -= test"?

我有一个函数可以找到给定整数的下一个2的幂。如果整数是2的幂,则返回幂。非常简单:charnextpow2if(inta){charfoo=char(32-__builtin_clz(a));boolispow2=!(a&a-1);if(ispow2)--foo;returnfoo;}然而,在使用带有-O2的gcc6进行编译之后,在检查生成的程序集之后,我发现这是在计算foo-1之后用看似无用的指令cmovne编译的。更糟糕的是,对于gcc5和更早的版本,我在代码中得到了一个实际的jne分支。编译它的更快方法就像我编写了以下函数:charnextpow2sub(inta){charfo

c++ - 指向可配置实现的 Pimpl 成语

我读到Pimpl有利于二进制兼容性,接口(interface)有利于轻松切换实现。我需要结合这两种技术,让我的应用程序能够通过配置文件切换底层实现。以下是我当前的设计布局:类Foo:提供面向客户端的API,我在这里关心ABI兼容性classIFoo:接口(interface)类(所有纯虚方法,虚dtor)Vendor1Foo类:使用Vendor1的库实现IFooVendor2Foo类:使用Vendor2的库实现IFoo不使用pimpl并严格使用接口(interface),客户端代码可能如下所示:IFoo*foo=newVendor1Foo();问题是我的客户端代码根本不知道Vendor

c++ - 可选的仅 header 库

我想编写一个C++库,默认情况下not-header-only但可以用作定义NOLIB宏的仅header库。我见过两种方法:内联定义foo.h#if!defined(FOO_H)#defineFOO_H#ifdefined(NOLIB)#defineMYINLINEinline#else#defineMYINLINE#endifclassfoo{//...};#ifdefined(NOLIB)#include"foo.cc"#endif#endif//includeguardfoo.cc#if!defined(NOLIB)#include"foo.h"#endifMYINLINEvoi

c++ - 错误 : jump to label 'foo' crosses initialization of 'bar'

以下C++示例无法使用gcc或clang进行编译,但仅使用ICC生成警告,而使用MSVC则完全不生成任何警告:intmain(intargc,char*argv[]){if(argcg++:init.cpp:13:error:jumptolabel‘clean_up’init.cpp:4:error:fromhereinit.cpp:7:error:crossesinitializationof‘inti’clang++:init.cpp:4:9:error:cannotjumpfromthisgotostatementtoitslabelgotoclean_up;^init.cpp:

c++ - 什么时候 namespace::function() 声明有用?

单个文件示例这是一个使用命名空间的简单程序。#includenamespacefoo{voidhello();}voidfoo::hello(){std::cout这个程序可以很好地编译并产生预期的输出。$./a.outhello我想知道什么时候voidfoo::hello();声明有用?在这个程序中,显然这个声明是多余的。但既然存在这种语法,这在其他一些场景中一定有用吗?双文件示例这是一个示例,表明voidfoo::hello();单独声明是无用的。//foo.cpp#includenamespacefoo{voidhello();}voidfoo::hello(){std::cou