Почему эта программа C ++ компилируется на MacOS, но не на Ubuntu? - PullRequest
2 голосов
/ 28 февраля 2020

Я использую Clang версии 10 на машинах с Ubuntu и MacOS:

ubuntu $ clang++ --version
clang version 10.0.0-++20200227124856+593a0dda7a6-1~exp1~20200227115450.103
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
osx $ clang++ --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

Следующая простая программа не компилируется в Ubuntu (16.04), но в MacOS 10.14:

// test.cpp

#include <atomic>
struct foo {

  bool bar;
  int baz;
  foo(bool bar, int baz) : bar(bar), baz(baz) {
  }
};

int main(int argc, char* argv[]) {
  std::atomic<foo> test_struct({false, 0});
  test_struct.load();

  return 0;
}

Я компилирую с

clang++ -std=c++14 test.cpp -o test

Ошибка в Ubuntu:

In file included from test.cpp:1:
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.4.0/../../../../include/c++/5.4.0/atomic:234:13: error: no matching constructor for initialization of 'foo'
        _Tp tmp;
            ^
test.cpp:13:11: note: in instantiation of member function 'std::atomic<foo>::load' requested here
  test_struct.load();
          ^
test.cpp:2:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided
struct foo {
       ^
test.cpp:2:8: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided
test.cpp:6:3: note: candidate constructor not viable: requires 2 arguments, but 0 were provided
  foo(bool bar, bool baz) :
  ^
1 error generated.

Я сталкиваюсь здесь с неопределенным поведением? Или какие меры мне нужно предпринять, чтобы сделать два сценария ios полностью равными?

Редактировать Я могу сделать эту компиляцию, добавив конструктор по умолчанию к типу. Однако я не могу разобрать это требование из std::atomic документации , и меня смущает, почему конструктор по умолчанию создается в MacOS, а не в Ubuntu.

1 Ответ

1 голос
/ 03 марта 2020

Ответ таков: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. * *. *....................... ". выбран стандарт (c++14).

Существует два решения:

  1. Каким-то образом установите обновленный libstdc++, который может быть или не быть в репозиториях пакетов APT для Ubuntu. версия (в моем случае нет более новой версии)
  2. Make clang использует реализацию LLVM libc++. Убедитесь, что установлена ​​последняя версия (пакет libc++-dev), и передайте -stdlib=libc++ во время компиляции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...