【问题标题】:C++ noexcept specification depending on data membersC++ noexcept 规范取决于数据成员
【发布时间】:2015-10-04 03:59:13
【问题描述】:

这个声明没问题:

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

虽然它形象地解释了我想要的东西。

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

【问题讨论】:

    标签: c++ c++11 noexcept


    【解决方案1】:

    std::declval&lt;T&gt;() 模拟右值 T 实例。 std::declval&lt;T&amp;&gt;() 模拟左值 T 实例。用这个代替T()

    【讨论】:

      【解决方案2】:

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

      简单的解决方法是将functor 的声明移到memberFunction 上方:

      template<class T> 
      class MyClass{
          private: 
              T functor; 
          public: 
              //ctor 
              ... 
              void memberFunction(double value); 
      };
      

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 2016-06-26
        • 2014-07-09
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        相关资源
        最近更新 更多