草庐IT

forward_static_call

全部标签

c++ - 为什么 C++11/14 中的 std::forward 没有 std::move_if_noexcept 对应项?

我观看了ScottMeyers在GoingNative2013“AnEffectiveC++11/14Sampler”上的演讲,他解释了std::move_if_noexcept的使用。所以我认为应该有一个std::forward_if_noexcept来保证forward的异常安全?为什么标准库中没有这样的东西?有没有其他保证的可能? 最佳答案 前向语义已经是有条件的,即它们保留其参数的值类别。另一方面,移动无条件地将其参数的值类别(从左值变为右值)更改为右值(引用),std::move_if_noexcept获得基于移动构造函数

c++ - 是否有满足 C99 标准的 static_assert 替代品?

我一直在尝试实现类似于C++11标准中定义的static_assert的方法。主要问题是C++编译器如何将传递给static_assert的文本消息编写为constchar*?我可以让编译器编写类似A_is_not_POD的消息。这就是我所拥有的:#defineMY_STATIC_ASSERT(condition,name)\typedefcharname[(condition)?1:-1];但是让编译器编写类似"Error:AisnotPOD."之类的东西会非常好。有什么建议吗? 最佳答案 不确定我是否理解问题,但C11有_Sta

c++ - "pure virtual function called"在 gcc 4.4 上,但不在新版本或 clang 3.4 上

我有一个MCVE,它在使用g++4.4.7版编译时在我的一些机器上崩溃,但可以在clang++3.4.2版和g++6.3版中使用。我想知道它是来自未定义的行为还是来自这个古老版本的gcc的实际错误。代码#includeclassBaseType{public:BaseType():_present(false){}virtual~BaseType(){}virtualvoidclear(){}virtualvoidsetString(constchar*value,constchar*fieldName){_present=(*value!='\0');}protected:virtu

c++11:std::forward 的微妙之处:身份真的有必要吗?

我设置了一个测试用例来学习完美转发。std::stringinner(conststd::string&str){return"conststd::string&";}std::stringinner(std::string&str){return"std::string&";}std::stringinner(conststd::string&&str){return"conststd::string&&";}std::stringinner(std::string&&str){return"std::string&&";}templatevoidouter(T&&t){std::c

c++ - static_cast<T>(...) 是编译时还是运行时?

是static_cast(...)在编译时或运行时完成的事情?我用谷歌搜索,但我得到了不同的答案。另外,dynamic_cast(...)显然是运行时——但是reinterpret_cast(...)呢?? 最佳答案 取决于您要转换的内容。例如。static_cast("Hello")最终调用std::string构造函数。在我的脑海中,我想不出任何reinterpret_cast的情况需要生成实际的机器指令。它只是告诉编译器:采用这种位模式,并相信它是这种类型的值。 关于c++-sta

c++ - BOOST_MPL_ASSERT 和 BOOST_STATIC_ASSERT 哪个更好?

我记得BOOST_MPL_ASSERT曾经是首选。这仍然是真的吗?有人知道为什么吗? 最佳答案 [回答我自己的问题]这取决于。这是一个苹果与橘子的比较。尽管相似,但这些宏不可互换。以下是每个工作原理的摘要:BOOST_STATIC_ASSERT(P)如果P!=true则生成编译错误.BOOST_MPL_ASSERT((P))如果P::type::value!=true则生成编译错误.尽管需要双括号,后一种形式特别有用,因为它可以生成更多信息性错误消息如果使用bool空元元函数来自Boost.MPL或TR1的作为谓词。这是一个示例程序

c++ - std::forward 如何接收正确的参数?

考虑:voidg(int&);voidg(int&&);templatevoidf(T&&x){g(std::forward(x));}intmain(){f(10);}既然id-expressionx是一个左值,而std::forward有左值和右值的重载,为什么调用不绑定(bind)到重载std::forward接受左值?templateconstexprT&&forward(std::remove_reference_t&t)noexcept; 最佳答案 它确实绑定(bind)到采用左值的std::forward的重载:tem

c++ - 内联函数上的 static_assert 给出错误

考虑以下情况typedefvoid(*foo)();templatestructbar{static_assert(f!=nullptr,"f==null!");};voidbaz(){}inlinevoidbax(){}barok;barbad;//error:non-constantconditionforstaticassertionbaz和bax都被接受为模板参数。它表明两者都被接受为常数。然而,在static_assert他们似乎是不同的(至少在gcc4.9中)-bax不再是一个常数。我的假设是static_assert和模板评估常数相同。例如。任何一个错误都应该是'bax不

c++ - constexpr、static_assert 和内联

我之前询问过functionoverloadingbasedonwhethertheargumentsareconstexpr.我正在尝试解决该问题的令人失望的答案,以制作更智能的断言功能。这大致就是我想要做的:inlinevoidsmart_assert(boolcondition){if(is_constexpr(condition))static_assert(condition,"Error!!!");elseassert(condition);}基本上,如果可以在编译时进行检查,那么编译时检查总是比运行时检查要好。但是,由于内联和常量折叠之类的原因,我不能总是知道是否可以进行

c++ - 部分模板特化触发 static_asserts

考虑这段代码templatestructdelay:std::false_type{};templatestructmy_typelist{static_assert(delay{},"");};templatestructtest;templatestructtest>{voidpass(){}};templatevoidfail(consttest&){}intmain(){test>t;t.pass();fail(t);}不调用fail()代码编译并运行良好。但是,在任何函数中使用t似乎都会触发my_typelist类中的static_assert,即使该类从未被实例化。尽管该示