草庐IT

c++ - decltype(foo(1)) 应该实例化 constexpr 函数模板 foo 吗?

以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试。templateconstexprautowrong=false;templateconstexprautofoo(constTt)->int{static_assert(wrong,"");return{};}usingF=decltype(foo(1));intmain(){}clang实例化函数体并偶然发现static_assert。gcc和MSVC只看函数声明,忽略函数体中的static_assert。如果删除constexpr,所有编译器都能正常编译代码。问题:如果声明了返回

c++ - 将默认构造函数添加到基类会更改派生类型的 sizeof()

这个问题在这里已经有了答案:Whenextendingapaddedstruct,whycan'textrafieldsbeplacedinthetailpadding?(4个答案)关闭4年前。我倾向于认为我对C++内部结构和内存布局有很好的掌握,但这个让我感到困惑。我有以下测试代码:#includestructFoo{//Foo(){}intx;chary;};structBar:publicFoo{charz[3];};intmain(){printf("Foo:%uBar:%u\n",(unsigned)sizeof(Foo),(unsigned)sizeof(Bar));}输出

c++ - 对于在类外定义的友元函数,模板上的隐式转换查找失败

下面的代码#include#includetemplatestructfoo{foo(std::nullptr_t){}//friendbooloperator==(foolhs,foorhs){returntrue;}templatefriendbooloperator==(foolhs,foorhs);};templateinlinebooloperator==(foolhs,foorhs){returntrue;}intmain(){foop=nullptr;assert(p==nullptr);}编译失败,出现错误信息foo.cpp:18:5:error:nomatchfor'

c++ - 为什么使用 auto 的直接列表初始化被认为是不好的或不受欢迎的?

我已经养成了使用直接列表初始化编写代码的习惯,因为它更有效,而且对于防止隐式narrowing非常有用。:inti{0};strings{""};charc{'a'};boolb{false};autonum{100};//Butthis??但是当涉及到自动说明符时,我听说这样写被认为是不好的或不受欢迎的,这是为什么呢? 最佳答案 这是使用该语法失败的示例:structFoo{};voideatFoo(constFoo&f){}intmain(){Fooa;autob{a};eatFoo(b);}您可能希望这没问题:b应该是Foo并

c++ - 如何插入STL集?

我有问题,我不确定我是否理解STL文档。假设我有这个:#include...structfoo{intbar;};structcomp{inlinebooloperator()(constfoo&left,constfoo&right){returnleft.barfooset;//Usescomparisonstruct/classobjectcomptosortthecontainer...return0;}如何使用我自己的比较器结构将结构foo插入到set中? 最佳答案 您可以使用set::insert方法,没有什么可做的。例

c++ - std::move(T&&) 和临时对象。临时从哪里来?

我很好奇为什么我不能编译下面的代码。这是无意义的代码(我知道),但我最初在其他一些使用具有完美转发等模板的代码中遇到了这个问题。我设法将问题缩小到std::move/std::forward/std::remove_reference,并且我'我很好奇为什么它首先需要一个临时的...#include#includestructFoo{Foo(Foo&&other){printf("Foo::(Foo&&)%p\n",this);}Foo(){printf("Foo::()%p\n",this);}~Foo(){printf("Foo::~Foo()%p\n",this);}};void

c++ - 静态内联方法?

好的,这是我正在尝试做的...现在正在编译但无法链接...LNK2001我希望这些方法是静态的,因为没有成员变量,但我也希望它们内联以提供加速。最好的方法是什么?简而言之,这是我所拥有的:/*foo.h*/classfoo{staticvoidbar(float*in);};/*foo.cpp*/inlinevoidfoo::bar(float*in){//somedarkmagichere}我正在尝试这样做,因为我希望能够:foo::bar(myFloatPtr);foo没有任何成员变量……这没有意义。 最佳答案 如果您从foo.

c++ - 使用具有同名方法的派生类的对象访问基类的方法

当使用派生类的对象访问“base”的foo()时。#includeclassbase{public:voidfoo(){std::cout如何访问派生类中具有同名方法的基类方法。已显示生成的错误。如果我不清楚,我深表歉意,但我觉得我已经把自己说得一清二楚了。提前致谢。 最佳答案 您可以将usingbase::foo添加到您的派生类中:classderived:publicbase{public:usingbase::foo;voidfoo(intk){std::cout编辑:thisquestion的答案解释了为什么如果没有usin

c++ - 为什么我可以从全局范围调用私有(private)构造函数?

此代码编译和运行没有错误:classfoo{staticfoo*ref;foo(){}public:staticfoo*getRef(){returnref;}voidbar(){}};foo*foo::ref=newfoo;//theconstrucrtorisprivate!intmain(intargc,constchar*argv[]){foo*f=foo::getRef();f->bar();return0;}谁能解释一下为什么可以调用构造函数? 最佳答案 该范围不是全局的-静态成员在类范围内,因此它们的初始化表达式也在类

c++ - 带有类类型 vector 的前向声明 - 不允许指向不完整类类型的指针

我有两个类,foo和bar。foo.h#includesbar.h并包含指向bar对象的指针的std::vector。在运行时的某个时刻,bar必须访问这个指向其他bar对象的指针vector。因此,foo包含一个名为getBarObjects()的方法,该方法返回指针数组。因此,我在bar.h中转发声明foo。显然,我还必须转发声明我正在使用的方法-foo::getBarObjects()。由于这会返回指向bar的指针数组,因此我陷入了恶性循环。我不能转发声明Bar然后简单地转发声明getBarObjects(),因为这会导致“不允许不完整的类型名称”。foo.h:#include"