'time_duration隐式复制赋值运算符的定义<boost::posix_time::time_duration

问题描述 投票:0回答:1

boost 版本 1.72.0

问题> 我应该怎么做才能解决这个构建问题?

boost_1.72.0/boost/date_time/posix_time/posix_time_config.hpp:16:
boost_1.72.0/boost/date_time/time_duration.hpp:68:5: error: definition of implicit copy assignment operator for 'time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' is deprecated because it has a user-declared copy constructor [-Werror,-Wdeprecated-copy]
    time_duration(const time_duration<T, rep_type>& other)
    ^
boost_1.72.0/boost/date_time/posix_time/posix_time_config.hpp:57:30: note: in implicit copy assignment operator for 'boost::date_time::time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' first required here
  class BOOST_SYMBOL_VISIBLE time_duration :
                             ^
boost_1.72.0/boost/date_time/time_duration.hpp:286:30: note: in implicit move assignment operator for 'boost::posix_time::time_duration' first required here
  class BOOST_SYMBOL_VISIBLE subsecond_duration : public base_duration
                             ^
note: in implicit move assignment operator for 'boost::date_time::subsecond_duration<boost::posix_time::time_duration, 1000000>' first 

required here
delay_int = boost::posix_time::microseconds(microSeconds);
          ^

class ABC
{
...
  void set_delay(uint32_t microSeconds);
  boost::posix_time::microseconds delay_int{0};
...
};

void ABC::set_delay(uint32_t microSeconds)
{
  delay_int = boost::posix_time::microseconds(microSeconds); // this line doesn't pass compiler checking
}

Update-1:根据建议改用time_duration,问题依旧

In file included from main.cpp:4:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time.hpp:15:
In file included from boost_1_72_0/boost/date_time/posix_time/ptime.hpp:12:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time_system.hpp:13:
In file included from boost_1_72_0/boost/date_time/posix_time/posix_time_config.hpp:16:
boost_1_72_0/boost/date_time/time_duration.hpp:68:5: error: definition of implicit copy assignment operator for 'time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' is deprecated because it has a user-declared copy constructor [-Werror,-Wdeprecated-copy]
    time_duration(const time_duration<T, rep_type>& other)
    ^
boost_1_72_0/boost/date_time/posix_time/posix_time_config.hpp:57:30: note: in implicit copy assignment operator for 'boost::date_time::time_duration<boost::posix_time::time_duration, boost::date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 1000000, 6>>' first required here
  class BOOST_SYMBOL_VISIBLE time_duration :
                             ^
main.cpp:17:15: note: in implicit move assignment operator for 'boost::posix_time::time_duration' first required here
    delay_int = boost::posix_time::microseconds(
              ^
1 error generated.

这里是代码片段:

#define BOOST_ASIO_DISABLE_CONCEPTS
#pragma GCC diagnostic ignored "-Wsuggest-override"

#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>

class ABC {
   public:
    void set_delay(uint32_t microSeconds);

   private:
    boost::posix_time::time_duration delay_int;
};

void ABC::set_delay(uint32_t microSeconds) {
    delay_int = boost::posix_time::microseconds(
        microSeconds);  // this line doesn't pass compiler checking
}

int main() {
    ABC abc;
    abc.set_delay(123123);

    std::cout << sizeof(boost::posix_time::microseconds) << " bytes\n";
    std::cout << sizeof(boost::posix_time::time_duration) << " bytes\n";
}
boost boost-asio
1个回答
1
投票

我无法重现警告,即使使用 Boost 1.72.0、较旧的 GCC/Clang 和标志

-Wall -Werror -Wdeprecated-copy -Wextra -pedantic -Wconversion
,请参阅Live On Compiler Explorer

#include <boost/date_time/posix_time/posix_time.hpp>

class ABC {
  public:
    void set_delay(uint32_t microSeconds);

  private:
    boost::posix_time::microseconds delay_int{0};
};

void ABC::set_delay(uint32_t microSeconds) {
    delay_int =
        boost::posix_time::microseconds(microSeconds); // this line doesn't pass compiler checking
}

int main() {
    ABC abc;
    abc.set_delay(123123);
}

一般来说只是一个警告。此外,这似乎是由于亚秒级划分并不是真正为直接使用而设计的(而是为了帮助初始化

time_duration<>
实例)。

我打赌如果你改用它,问题就会消失:

boost::posix_time::time_duration delay_int;

还请注意,这两种类型具有相同的占用空间,只是

time_duration
具有您期望的应用程序级接口。

同样生活

#include <boost/date_time/posix_time/posix_time.hpp>

class ABC {
   public:
    void set_delay(uint32_t microSeconds);

   private:
    boost::posix_time::time_duration delay_int;
};

void ABC::set_delay(uint32_t microSeconds) {
    delay_int = boost::posix_time::microseconds(
        microSeconds);  // this line doesn't pass compiler checking
}

int main() {
    ABC abc;
    abc.set_delay(123123);

    std::cout << sizeof(boost::posix_time::microseconds) << " bytes\n";
    std::cout << sizeof(boost::posix_time::time_duration) << " bytes\n";
}

打印

8 bytes
8 bytes
© www.soinside.com 2019 - 2024. All rights reserved.