Почему MacOS Clang не может использовать C ++ 17 std? - PullRequest
2 голосов
/ 14 мая 2019

Я хочу использовать c ++ 1z в MacOS10.14.4, как это g++ -std=c++1z test.cpp -o test.Но clang не может скомпилировать код.

Ошибка выглядит следующим образом.

In file included from test.cpp:3:
/Library/Developer/CommandLineTools/usr/include/c++/v1/any:599:5: error: static_assert failed due to requirement 'is_constructible<basic_string<char> &&, _RawValueType
      &>::value' "ValueType is required to be an lvalue reference or a CopyConstructible type"
    static_assert(is_constructible<_ValueType, _RawValueType &>::value,
    ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:29:19: note: in instantiation of function template specialization 'std::__1::any_cast<std::__1::basic_string<char> &&>' requested here
    auto b = std::any_cast<std::string&&>(a); //< rvalue reference (no need for std::move)
                  ^
1 error generated.

Но тот же код может работать в Linux.Код следующий.

#include <string>
#include <iostream>
#include <any>

int main()
{
    // simple example 

    auto a = std::any(12);

    std::cout << std::any_cast<int>(a) << '\n'; 

    try {
        std::cout << std::any_cast<std::string>(a) << '\n';
    }
    catch(const std::bad_any_cast& e) {
        std::cout << e.what() << '\n';
    }

    // advanced example

    a = std::string("hello");

    auto& ra = std::any_cast<std::string&>(a); //< reference
    ra[1] = 'o';

    std::cout << "a: " << std::any_cast<const std::string&>(a) << '\n'; //< const reference

    auto b = std::any_cast<std::string&&>(a); //< rvalue reference (no need for std::move)

    // Note, 'b' is a move-constructed std::string, 'a' is now empty

    std::cout << "a: " << *std::any_cast<std::string>(&a) //< pointer
        << "b: " << b << '\n';
}

версия clang: Apple LLVM версия 10.0.1 (clang-1001.0.46.4)

И я использую gcc для компиляции этого кода, но неработать либо.

1 Ответ

2 голосов
/ 14 мая 2019

Это, кажется, от https://developercommunity.visualstudio.com/content/problem/200281/stdany-cast-static-assert-error-because-of-is-cons.html,, на который есть ответ от Microsoft.Ответ был таким, что это был дефект LWG 2768 , поэтому исправление, возможно, не было реализовано в более старых реализациях стандартной библиотеки. Например, , это компилируется в clang 6.0.0 и gcc 7.4, но не в clang 7.0.0 и gcc 8.1.

Причина в том, что вы не можете взять ссылку на rvalueЛюбое значение.Исправьте это, либо взяв ссылку lvalue и переместив ее, либо взяв ссылку rvalue перемещенного любого:

std::move(std::any_cast<std::string&>(a));
std::any_cast<std::string&&>(std::move(a));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...