这个声明没问题:
void memberFunction(T& functor, double value)noexcept(noexcept(functor(value)));
表示
template<class T>
class MyClass{
public:
void memberFunction(T& functor, double value)noexcept(noexcept(functor(value)));
};
让我们说MyClass有一个仿函数数据成员:
template<class T>
class MyClass{
public:
//ctor
...
void memberFunction(double value);
private:
T functor;
};
我想编写noexcept规范,就像我在上一个案例中所做的那样, 我试过这个:
void memberFunction(double value)noexcept(noexcept(functor(value)));
但编译器告诉我,仿函数不是范围。 以下原因并非如此:
void memberFunction(double value)noexcept(noexcept(this->functor(value)));
以下无法正常工作,因为我有一些用作T的课程缺乏 默认构造函数:
void memberFunction(double value)noexcept(noexcept(T()(value)));
以下是合成错误:
void memberFunction(double value)noexcept(noexcept(T::operator(double)));
尽管它以图形方式很好地解释了我想要的东西。
有什么建议吗? 目前我放弃了规范...
答案 0 :(得分:2)
noexcept
规范是memberFunction
声明的一部分,因此无法访问之后声明的任何成员数据。
简单的解决方法是将functor
的声明移到memberFunction
之上:
template<class T>
class MyClass{
private:
T functor;
public:
//ctor
...
void memberFunction(double value);
};
答案 1 :(得分:2)
std::declval<T>()
模拟右值T
实例。 std::declval<T&>()
模拟左值T
实例。用它代替T()
。