草庐IT

c++ - 这个 constexpr 虚函数技术是否违反了任何 C++11/C++14 规则?

前几天我在阅读C++文档时注意到,虽然字面量类型不能有虚成员,但这并不妨碍它们实现虚成员。或者至少我是这么理解的。这是我一直在玩的一段代码:#include//Someforwarddeclarations:enumclassliteral_id;structliteral_base;structliteral_a;structliteral_b;//Nowsomedefinitions:enumclassliteral_id{a,b};structliteral_base{virtualliteral_idmethod()constnoexcept=0;};structliteral

c++ - 为什么复制 const shared_ptr& 不会违反 const-ness?

尽管我的代码编译得很好,但这一直困扰着我,我无法在stackoverflow上找到答案。以下通用构造函数是将shared_ptr传递给构造函数中的类实例的一种方法。MyClass{MyClass(conststd::shared_ptr&pt);std::shared_ptrpt_;//EDITED:Removed&typo};MyClass::MyClass(conststd::shared_ptr&pt):pt_(pt){}这编译得很好。我的问题如下:在我的理解中,像这样声明一个参数const:voidmyfunc(constT&t)promise不改变t。但是,通过将shared

c++ - 如何在不违反 const 正确性的情况下使用 std::lock_guard?

在一个子类中,我有一个私有(private)的std::mutexm字段,我在基类纯虚方法的实现中使用它以线程安全的方式返回一个值(值可以由另一个线程更新):intSubClass::get()const//implements'virtualintget()=0const'ofthebaseclass{std::lock_guardlck(m);returnvalue;}编译器通过产生错误告诉我这违反了const正确性:error:binding'conststd::mutex'toreferenceoftype'std::lock_guard::mutex_type&{akastd

c++ - 在没有 main() 的情况下运行的 C 或 C++ 程序是否违反标准?

我参与了与我的一位同事的讨论,他说可以在没有main的情况下在C和C++中“运行程序”,并且在托管环境中也是如此。我说过,根据标准,这是完全不正确的。然后他让我看this提到的链接Inseveralyears,anentrywassubmittedthatwassopatentlyabsurdthatitrequiredanewdefinitionofsomeoftherulesforthenextyear.Thisisregardedasahighhonor.Anexampleistheworld'sshortestself-reproducingprogram.Theentrywa

c++ - 为什么 Visual Studio 编译器在此示例中允许违反私有(private)继承?

我在VisualStudio2013和2017中发现std::unique_ptr的行为非常奇怪。让我们考虑一个例子:classBase{public:virtual~Base()=default;virtualvoidFoo()=0;};classDerived:privateBase{public:voidFoo()override{std::couta){a->Foo();}Foo(std::unique_ptr(newDerived()));//Compiles请注意,继承是私有(private)的。此示例仅在VisualStudio上编译。而且,虚函数调用是有效的,因为它是公

c++ - 为什么将 set::iterator 而不是 const_iterator 传递给函数会违反单一定义规则?

std::set的描述容器givenbycppreference.com最后包含此注释:Themembertypesiteratorandconst_iteratormaybealiasestothesametype.Sinceiteratorisconvertibletoconst_iterator,const_iteratorshouldbeusedinfunctionparameterliststoavoidviolationsoftheOneDefinitionRule.我不明白最后这句话。我的理解是一个集合不允许修改它的元素(如果你需要改变一个,你必须erase它然后inse

c++ - 这两个类是否违反封装?

classX{protected:voidprotectedFunction(){cout这样我就可以公开基类的功能之一。这不是违反了封装原则吗?是否有关于为什么这是标准的具体原因?这个有什么用吗,或者它会在新标准中改变吗?标准中是否有任何与此相关的未解决问题? 最佳答案 你自己做的。你可以写classY:publicX{public:voiddoA(){protectedFunction();}};intmain(){Yy1;y1.doA();}我认为没有任何理由担心它。protected函数是继承树中的可重用逻辑片段。如果有一些

c++ - header 中的字符串——这是否违反了 ODR?

考虑以下具有两个编译单元的程序。//a.hppclassA{staticconstchar*get(){return"foo";}};voidf();//a.cpp#include"a.hpp"#includevoidf(){std::cout//main.cpp#include"a.hpp"#includevoidg(){std::cout出于某种原因需要创建全局字符串常量是很常见的。以完全天真的方式执行此操作会导致链接器问题。通常,人们将声明放在头文件中,将定义放在单个编译单元中,或者使用宏。我的印象是这种使用函数的方式(如上所示)是“好的”,因为它是一个inline函数并且链接器

generics - 如何解决 Kotlin 中违反有限界限制的问题?

这个问题在这里已经有了答案:Crossreferencesintypeparameters(2个回答)关闭5年前。假设我在Java中有这个声明,没关系。abstractclassStart{publicTend;}abstractclassEnd{publicTstart;}但是,在Kotlin中不行,因为Kotlin对“循环”类型参数有限制。abstractclassStart>{lateinitvarend:T}abstractclassEnd>{lateinitvarstart:T}在Kotlin中是否有任何方法可以解决这个问题,以便我可以拥有相互依赖的泛型类型?

generics - 如何解决 Kotlin 中违反有限界限制的问题?

这个问题在这里已经有了答案:Crossreferencesintypeparameters(2个回答)关闭5年前。假设我在Java中有这个声明,没关系。abstractclassStart{publicTend;}abstractclassEnd{publicTstart;}但是,在Kotlin中不行,因为Kotlin对“循环”类型参数有限制。abstractclassStart>{lateinitvarend:T}abstractclassEnd>{lateinitvarstart:T}在Kotlin中是否有任何方法可以解决这个问题,以便我可以拥有相互依赖的泛型类型?