采取以下代码:
templatevoid my_func() { T::some_method(); } int main() { std::cout << (noexcept(my_func ()) ? "noexcept" : "can throw") << std::endl; return 0; }
my_func()
即使SomeClass::some_method()
标记为noexcept,这将始终打印出可能抛出的图像。(至少使用gcc 7.4.0和-std = c ++ 17)
有没有一种实用的方法可以使编译器noexcept
根据模板参数检测函数是否存在?
我唯一想到的就是使用std :: enable_if:
templatestd::enable_if_t my_func() noexcept { T::some_method(); } template std::enable_if_t my_func() { T::some_method(); }
但是,这会占用大量空间并导致代码重复。
noexcept
规格有一个采用布尔值的版本。
templatevoid my_func() noexcept(noexcept(T::some_method())) { T::some_method(); }
现在,基于表达式它将有条件地例外T::some_method()
。