C ++ noexcept规范取决于数据成员

时间:2015-07-15 08:07:40

标签: c++ c++11 noexcept

这个声明没问题:

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))); 
尽管它以图形方式很好地解释了我想要的东西。

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

2 个答案:

答案 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()