草庐IT

c++ - 从 std::enable_shared_from_this 和抽象基类派生可以吗?

我正在编写一个应该从抽象基类派生的类。我无法更改抽象基类。该类(class)将以shared_ptr的形式举行到抽象基类。继承抽象基类和可以吗enable_shared_from_this?像这样:classIWidget{public:virtual~IWidget(){}//...};classWidget:publicstd::enable_shared_from_this,publicIWidget{protected:Widget();//protected,usecreatepublic:staticstd::shared_ptrcreate(){returnstd::sh

c++ - 从 std::enable_shared_from_this 和抽象基类派生可以吗?

我正在编写一个应该从抽象基类派生的类。我无法更改抽象基类。该类(class)将以shared_ptr的形式举行到抽象基类。继承抽象基类和可以吗enable_shared_from_this?像这样:classIWidget{public:virtual~IWidget(){}//...};classWidget:publicstd::enable_shared_from_this,publicIWidget{protected:Widget();//protected,usecreatepublic:staticstd::shared_ptrcreate(){returnstd::sh

c++ - 重载函数模板消歧与 `std::enable_if` 和非推断上下文

考虑以下代码:templatestructdependent_type{usingtype=T;};templateautofoo(T)->std::enable_if_t{}>{std::coutvoidfoo(typenamedependent_type::type){std::coutfoo的第一次重载可以推断T从它的调用。foo的第二次重载是non-deducedcontext.intmain(){foo(1);//prints"b"foo(1.0);//prints"b"foo(1);//prints"a"}为什么foo(1)打印“b”而不是“a”?wandboxexampl

c++ - 重载函数模板消歧与 `std::enable_if` 和非推断上下文

考虑以下代码:templatestructdependent_type{usingtype=T;};templateautofoo(T)->std::enable_if_t{}>{std::coutvoidfoo(typenamedependent_type::type){std::coutfoo的第一次重载可以推断T从它的调用。foo的第二次重载是non-deducedcontext.intmain(){foo(1);//prints"b"foo(1.0);//prints"b"foo(1);//prints"a"}为什么foo(1)打印“b”而不是“a”?wandboxexampl

c++ - SFINAE:static_assert 与 std::enable_if

以下(建议!)语法有什么缺点吗?templatevoidf()static_assert(std::is_same::value){;}而不是SFINAE(看起来像拐杖):template::value>::type>voidf(){;}甚至更糟:templatetypenamestd::enable_if::value>::typef(){;}其中禁止使用auto推导结果类型。 最佳答案 首先,它们是不同的,特别是它们不是同时检查的。关键的区别在于它们在重载解析方面的应用。SFINAE将从重载集中剔除函数,以便选择另一个函数(如果

c++ - SFINAE:static_assert 与 std::enable_if

以下(建议!)语法有什么缺点吗?templatevoidf()static_assert(std::is_same::value){;}而不是SFINAE(看起来像拐杖):template::value>::type>voidf(){;}甚至更糟:templatetypenamestd::enable_if::value>::typef(){;}其中禁止使用auto推导结果类型。 最佳答案 首先,它们是不同的,特别是它们不是同时检查的。关键的区别在于它们在重载解析方面的应用。SFINAE将从重载集中剔除函数,以便选择另一个函数(如果

c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器

更新(2016年9月30日)gcc-6.2的Ubuntu版本((Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901)不再有这个问题。我正在使用gcc-6.1[1]((Ubuntu6.1.1-3ubuntu11~14.04.1)6.1.120160511)、GNUbinutils2.24和支持GLIBCXX_3.4.22的libstdc++的Ubuntu版本。即使在一个简单的“helloworld”程序中,指定sanitizer也不会强制使用黄金链接器。main.cpp#includeintmain(){std::cout编译和链接g++-fsanitiz

c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器

更新(2016年9月30日)gcc-6.2的Ubuntu版本((Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901)不再有这个问题。我正在使用gcc-6.1[1]((Ubuntu6.1.1-3ubuntu11~14.04.1)6.1.120160511)、GNUbinutils2.24和支持GLIBCXX_3.4.22的libstdc++的Ubuntu版本。即使在一个简单的“helloworld”程序中,指定sanitizer也不会强制使用黄金链接器。main.cpp#includeintmain(){std::cout编译和链接g++-fsanitiz

c++ - 从 'enable_shared_from_this' 派生一个类可以提高性能吗?

make_shared比单独调用new并创建shared_ptr性能更高,因为make_shared为引用分配空间在与客户端对象实例相同的内存块中计数和弱计数(有效地为shared_ptr提供了intrusive_ptr的大部分性能优势)。enable_shared_from_this给出一个共享指针,而不引用任何共享指针。因此,必须以某种方式从客户端对象内部访问诸如引用和弱计数之类的东西。因此,enable_shared_from_this导致类似于make_shared的侵入性计数是明智的。但是,我不知道如何实现类似的东西(即使我查看实际来源,我也不确定我是否会关注其中发生的事情)

c++ - 从 'enable_shared_from_this' 派生一个类可以提高性能吗?

make_shared比单独调用new并创建shared_ptr性能更高,因为make_shared为引用分配空间在与客户端对象实例相同的内存块中计数和弱计数(有效地为shared_ptr提供了intrusive_ptr的大部分性能优势)。enable_shared_from_this给出一个共享指针,而不引用任何共享指针。因此,必须以某种方式从客户端对象内部访问诸如引用和弱计数之类的东西。因此,enable_shared_from_this导致类似于make_shared的侵入性计数是明智的。但是,我不知道如何实现类似的东西(即使我查看实际来源,我也不确定我是否会关注其中发生的事情)