1

这个声明没问题:

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))); 

尽管它形象地解释了我想要的东西。

有什么建议吗?目前我放弃了规范......

4

2 回答 2

2

std::declval<T>()模拟一个右值T实例。 std::declval<T&>()模拟左值T实例。使用它代替T().

于 2015-07-15T08:18:03.743 回答
2

noexcept规范是声明的一部分,memberFunction因此无法访问之后声明的任何成员数据。

简单的解决方法是移动functor上面的声明memberFunction

template<class T> 
class MyClass{
    private: 
        T functor; 
    public: 
        //ctor 
        ... 
        void memberFunction(double value); 
};
于 2015-07-15T08:10:24.317 回答