【问题标题】:Compiling with deleted functions fails with uclibc使用 uclibc 编译删除的函数失败
【发布时间】:2018-08-30 13:48:32
【问题描述】:

我有一个项目要从 glibc 移植到 uclibc,但遇到了这个奇怪的问题。

gcc --std=c++11 Foo.cpp -o Foo-glibc
x86_64-linux-uclibc-gcc --std=c++11 Foo.cpp -o Foo-uclibc

// Compiles under glibc and uclibc
class Foo {
  Foo() = default;
  Foo(const Foo& arg) = delete;
  ~Foo() = default;
};

// Only compiles under glibc
class Foo {
  Foo() = default;
  Foo(const Foo& arg);
  ~Foo() = default;
};
Foo::Foo(const Foo& arg) = delete; // uclibc - Error: deleted definition of 'Foo::Foo(const Foo&)'

为什么会出现这个错误?这是预期的行为吗?我读过的任何内容都表明 uclibc 不应该能够处理这个问题。

【问题讨论】:

  • Ulibc 本身就是一个库,与编译器没有任何关系(至少与编译无关)。你确定你的 gcc 是同一个版本吗? (运行gcc --versionx86_64-linux-uclibc-gcc --version
  • gcc --version 产生 4.8.5 和 x86_64-linux-uclibc-gcc --version 产生 7.3.0。所以这很可能与编译器之间的版本差异有关,尽管我不确定为什么较新的编译器会删除这个函数。
  • 这可能是一个错误,它首先工作,在类声明中声明构造函数然后将其删除是没有意义的。类的消费者如何知道构造函数被删除?

标签: c++ gcc glibc uclibc


【解决方案1】:

这很可能是旧 gcc 版本中的错误。

在 4.8.5 中为 worked,但在 5.1.0 中为 doesn't

引用艾伦·伯特尔斯的话

[I] 在类声明[,] 中声明构造函数然后将其删除是没有意义的。类的消费者如何知道构造函数已被删除?

【讨论】:

  • 原来是这样。那么我应该开始使用一些更新的编译器进行开发!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多