2016-12-07 57 views
-1

你能说我该如何断言,是函数noexcept(不传递参数)?谢谢。否 - 除非不通过参数

+0

一般来说,如果不指定参数,也不能指定参数 - 可能会有多个同名的重载,有些是noexcept,有些则不是。 –

回答

0

假设你问:

我怎么可以断言,一个功能是noexcept不调用呢?

答案是你不能,因为noexcept说明符在重载之间可能不同。例如:

int a(int) noexcept; 
int a(int, int); 

// What would `noexcept(a)` mean? 
+0

的#include 的#include 空隙FF()noexcept { } 类A { 公共: 空隙f()的noexcept { FF(); } }; (noexcept((obj - > * f)),“kl”);以及其中, } int main() { A a; 克(一,&A::f); } –

+0

例如我认为该返回错误值 的#include 的#include 空隙FF()noexcept { } 类A { 公共: 空隙f()的noexcept { FF();} }; 空隙克(A * OBJ,空隙(A :: * F)())(noexcept((obj - > * f)),“kl”); } int main() { A a; 克(&A,&A::f); } 为什么它的断言? –

+0

能否请你张贴在wandbox或相似? –

5

假设你问(感谢@VittorioRomeo的假设):

我怎么可以断言,一个功能是noexcept不调用呢?

您可以使用noexcept运算符来做到这一点,因为它的操作数是未评估的操作数。
在其他方面,你可以这样做:

void f(int) noexcept { } 
void f(int, int) { } 

int main() { 
    static_assert(noexcept(f(0)), "!"); 
    static_assert(not noexcept(f(0, 0)), "!"); 
} 

f不会叫在任何情况下,这是一个未计算的操作数(让我说)性质

最有趣的部分是,如果您没有变量作为参数使用,而且您不知道如何构造变量,则可以将它与std::declval结合使用。
作为一个例子:

#include<utility> 

struct S { S(int) {} }; 

void f(S) noexcept { } 

int main() { 
    static_assert(noexcept(f(std::declval<S>())), "!"); 
} 

请注意,我没有通过任何构建S,即使它有没有一个默认的构造函数。

这通常足以满足通过无参数的要求。