草庐IT

c++ - 编译器用来决定 move 操作是否安全的标准是什么?

给定以下代码(http://liveworkspace.org/code/5oact):classFoo{public:Foo(){log(__PRETTY_FUNCTION__);}Foo(constFoo&other){log(__PRETTY_FUNCTION__);}Foo&operator=(constFoo&other){log(__PRETTY_FUNCTION__);return*this;}Foo(Foo&&other)noexcept{log(__PRETTY_FUNCTION__);}Foo&operator=(Foo&&other)noexcept{log(__

c++ - 用这个技巧从外部访问 protected 成员,但这有效吗?

如果我有以下类(class):classFoo{protected:inti;public:Foo():i(42){}};当然,我无法从外部访问protected成员,但我可以做这个小技巧:首先我创建一个继承Foo的新类:classFoo2:publicFoo{public:intGetI(){returni;}};现在,只要我有一个Foo的实例或指向此类实例的指针,我就可以通过强制转换访问protected成员(因为我不使用任何其他成员):Foo*f=newFoo();Foof2;std::coutGetI()(f2)).GetI()我明白为什么会这样,但会不会有任何不良后果?编译器

c++ - 写 foo(const float&) 是在浪费精力吗?

当传递像int或float这样的原始类型时,这样写是不是浪费了精力:foo(constfloat&);而不只是按值传递:foo(float); 最佳答案 为了花车?Yes,prettymuch.这里根本没有任何好处:float很小,复制不会比创建指针来实现引用慢。 关于c++-写foo(constfloat&)是在浪费精力吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/210

c++ - constexpr 结构是否被零初始化?

考虑以下示例:templatestructfoo{constexprfoo():a(){}inta[N];};intmain(){foo{}).a[0]>f;}尝试编译时,clang推断出foo作为f的类型同时g++因内部编译器错误而崩溃。然而,是a-foo的成员|保证为零,还是这种未定义/未指定的行为? 最佳答案 成员初始化器a()值初始化foo::a(通过[class.base.init]/7,这导致[dcl.init]/11)。[dcl.init]/8指定数组的值初始化对数组的每个元素进行值初始化。对于ints(和其他基本类型

c++ - 是 int & foo();一个左值?

我知道可能还有其他类似的问题,但他们没有完全回答我的问题。我一直在浏览有关C++类型推导的讲座中的一些幻灯片,在其中一张中我发现了以下语句:int&foo();//foo()islvalue;起初,我以为这是错误的——foo是一个函数,它不能被赋值,它不是一个左值。但现在我想作者可能有不同的想法。也就是说,函数调用可能是左值,而不是函数本身。换句话说:foo是左值吗?foo()是左值吗?是否可以将函数(不是函数调用)分配给(即foo=something;)?“左值是可以分配给的每个对象/事物”-这个陈述总是正确和准确的吗?问题4需要更多解释。有了它,我试图理解什么是左值。我看到的另一个

c++ - 为什么(删除的)复制构造函数优于隐式转换?

考虑下面的代码:structBar{};structFoo{Foo()=default;Foo(constBar&){}Foo(constFoo&)=delete;//IMPLICITconversiontoBaroperatorBar(){return{};}};intmain(){Foof1;Foof2(static_cast(f1));//thisisOKFoof3(f1);//doesnotcompile,whynotimplicitconversionto`Bar`?}类Bar有一个用户定义的转换运算符到Foo,它接受Bar&。然而,在main的最后一行,我希望Foof1被转

c++ - 在初始化构造函数时 {} 或 default 之间是否有任何差异

这三种默认类构造函数的方法之间是否有任何区别(无论多么微小):直接在header中使用{}://foo.hclassfoo{public:foo(){}}直接在header中使用default关键字://foo.hclassfoo{public:foo()=default;}在cpp中使用{}//foo.hclassfoo{public:foo();}//foo.cpp#include"foo.h"foo::foo(){} 最佳答案 是的,有区别。选项1和3是用户提供的。用户提供的构造函数是非平凡的,使类本身非平凡。这对如何处理类有

c++ - 总是使用构造函数而不是显式转换运算符

我有以下类(class):templateclassFoo{public:Foo(T1*obj):obj(obj){}templateFoo(constFoo&other):obj(other.obj){}templateexplicitoperatorFoo(){returnFoo(static_cast(obj));}T1*obj;};第二个构造函数的目的是从Foo隐式转换至Foo如果从X*进行隐式转换,则允许至Y*是允许的。转换运算符允许从Foo进行显式转换至Foo使用来自X*的显式转换至Y*.但我注意到转换运算符从未被使用过。编译器总是使用第二个构造函数,即使我进行显式转换也是

c++ - 将 C 对象数组包装到 C++ 类中

我有带有这样API的C库:extern"C"{typedefstructOpaqueOpaque;Opaque*foo_new();voidfoo_delete(Opaque*);intfoo_f(Opaque*,int);}为了简化它的使用,我将它包装成这样:classFoofinal{public:Foo(){self_=foo_new();}~Foo(){foo_delete(self_);}//codeforcopy/moveconstructorandoperator=intf(inta){returnfoo_f(self_,a);}private:Opaque*self_;

c++ - 为什么 Google Test/Mock 通过 std::unique_ptr 显示泄露的模拟对象错误?

假设有一个Bar对象,它使用了一个Foo对象。所有权是独占的,因此Bar在其构造函数中将Foo作为std::unique_ptr获取。我想用Google测试框架测试Bar,所以我编写了以下代码:usingnamespacetesting;classFoo{public:virtualintF()=0;};classBar{public:Bar(std::unique_ptr&&foo):m_foo(std::move(foo)){}intB(){returnm_foo->F();}private:std::unique_ptrm_foo;};classMockFoo:publicFoo