未声明constexpr,std::forward将丢弃任何将参数转发到的函数的constexpr-ness。为什么std::forward没有声明constexpr本身以便它可以保留constexpr-ness?示例:(使用g++snapshot-2011-02-19测试)#includetemplateconstexprintf(Tx){return-13;}templateconstexprintg(T&&x){returnf(std::forward(x));}intmain(){constexprintj=f(3.5f);//nextlinedoesnotcompile://
这个问题在这里已经有了答案:Staticanalysisofnoexcept"violations"inC++(2个答案)关闭4年前。我大量使用noexcept,不幸的是,如果某些传递依赖最终导致极少数情况(我们不知道),崩溃将非常难以调试-因为noexcept会导致std::terminate被调用。有什么方法可以在编译时检测到这些违规行为吗?在下面的例子中问题很明显,但默认情况下没有编译器捕获它。我意识到这在所有情况下都是不可能的,但肯定应该可以实现更简单的情况#includevoidbaz(){throwstd::runtime_error("std::terminateawai
以下代码无法使用VisualStudio2017(15.5)、gcc6.4.0和clang4.0.1进行编译,即静态断言失败:structType{Type(Type&&)noexcept{}~Type()noexcept(false){}};static_assert(std::is_nothrow_move_constructible::value,"Typeshouldbenothrow-move-constructible");static_assert(std::is_nothrow_constructible::value,"Typeshouldbenothrow-cons
Here我发现:Inheritingconstructors [...]areall noexcept(true) bydefault,unlesstheyarerequiredtocallafunctionthatis noexcept(false),inwhichcasethesefunctionsare noexcept(false).这是否意味着在下面的示例中继承的构造函数是noexcept(true),即使它已在基类中显式定义为noexcept(false),或者它本身被认为是一个不被调用的函数?structBase{Base()noexcept(false){}};stru
我有一个这样的函数模板:templateconstexprautomyfunc()noexcept{returnT{};}这个函数模板是否因为复制省略而保证是noexcept?如果在构造函数内部抛出异常,这是发生在函数内部还是外部? 最佳答案 复制省略所做的就是消除实际的复制或移动。一切都发生“好像”事情发生而没有发生复制省略(当然除了复制本身)。构造发生在函数内部。复制省略不会改变这一点。它所做的只是消除实际复制/移动的发生(我在重复自己吗?)作为函数的返回值被推回其调用者的结果。因此,如果类的default构造函数抛出异常,no
我有下一个代码:#include#includevoidg(){throw1;}void(*p)()=g;templatevoidf(T)noexcept(noexcept(T()))//warning1{p();}structA{A(){}};//warning2intmain(){try{f(A());}catch(int){}return1;}还有下一个选项:-fno-pic-fmessage-length=0-std=c++0x-Wnoexceptg++抛出下一个警告:noexcept03.C:16:6:warning:noexcept-expressionevaluatest
我正在将我的项目从VS2015迁移到VS2017,这当然不会很顺利。我看到奇怪的编译器错误,可以通过以下代码重现:structMoveOnly{MoveOnly(){}MoveOnly(constMoveOnly&)=delete;MoveOnly&operator=(constMoveOnly&)=delete;MoveOnly(MoveOnly&&)=default;MoveOnly&operator=(MoveOnly&&)=default;booloperator==(constMoveOnly&rhs)const{returnfalse;}};structHasher{siz
举个例子classX{intvalue;public:X(intdef=0):value(def){}voidadd(inti){value+=i;}};显然,函数voidX::add(int)永远不会抛出任何异常。我的问题是,编译器能否分析代码并决定不生成机器代码来处理异常,即使该函数未标记为noexcept? 最佳答案 如果编译器可以证明一个函数永远不会抛出异常,则“As-If”规则(§1.9,C++标准的“程序执行”)允许删除处理异常的代码。但是,无法确定一个函数是否永远不会抛出一般情况,因为这相当于解决了停机问题。
Thispage说make_optionalC++17中的函数返回constexproptional.我认为(虽然我可能是错的)这需要optional有一个constexpr复制或移动构造函数。然而,thispage也说不是这样的。我不知道如何make_optional可以按照当前的C++1z草案实现。参见thispost为了澄清。是否有一些解决方法,或者这可能只是标准草案/cppreference的错误? 最佳答案 感谢@Yakk和@T.C.为了他们的解释。我觉得一个例子应该让事情更清楚:structwrapper{intvalu
在ScottMeyers的“EffectiveModernC++”中,他给出了以下函数来查找数组的大小:templateconstexprstd::size_tarraySize(T(&)[N])noexcept{returnN;}这里'noexcept'的目的是什么?据我了解,noexcept仅影响运行时代码的生成-但我看不到任何可以在运行时而不是编译时调用此函数的情况? 最佳答案 在一般情况下,标记为constexpr的模板在实例化时可能会失去该状态。如果一组特定的模板参数不允许,则该限定将被静默删除,并且生成的函数是一个“常规