Visual Studio 2019 отклоняет «концепцию bool», в то время как g cc 8 не компилирует концепции без «bool» - PullRequest
0 голосов
/ 14 марта 2020

Я думал, что концепции c ++ - лучший метод для написания шаблонного кода c ++ с лучшими сообщениями об ошибках и более быстрым временем компиляции, поэтому я обновил Visual Studio до 2019 и все еще жду, когда clang поддержит концепции

, однако я протестировал некоторые простой код с msv c из Visual Studio 2019 и g ++ 8 из mingw-w64, и у меня возникли некоторые проблемы.

Это тест:

#include <iostream>

using namespace std;

// this compiles under g++ 8 but not visual studio 2019
template <class T>
bool concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> ||
    std::is_same_v<T, char16_t> || std::is_same_v<T, char32_t>;

// this compile under visual studio 2019 but not g++
//template <class T>
//concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> ||
//  std::is_same_v<T, char16_t> || std::is_same_v<T, char32_t>; 

template <CharT char_type>
void PrintChar(char_type ch)
{
    wcout << ch << endl;
}

int main()
{
    PrintChar('c');
    PrintChar(L'h');
    PrintChar('a');
    PrintChar('r');
}

Вызов Visual Studio:

cl /std:c++latest concepts.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28316 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

/std:c++latest is provided as a preview of language features from the latest C++
working draft, and we're eager to hear about bugs and suggestions for improvements.
However, note that these features are provided as-is without support, and subject
to changes or removal as the working draft evolves. See
https://go.microsoft.com/fwlink/?linkid=2045807 for details.

concepts.cpp
concepts.cpp(7): error C2988: unrecognizable template declaration/definition
concepts.cpp(7): error C2059: syntax error: 'concept'
concepts.cpp(7): fatal error C1903: unable to recover from previous error(s); stopping compilation
Internal Compiler Error in C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\HostX64\x64\cl.exe.  You will be prompted to send an error report to Microsoft later.

вызов g ++

g++ -std=c++2a -fconcepts concepts.cpp -o c.exe
concepts.cpp:12:9: error: 'CharT' does not name a type; did you mean 'char'?
 concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> ||
         ^~~~~
         char
concepts.cpp:15:11: error: 'CharT' has not been declared
 template <CharT char_type>
           ^~~~~
concepts.cpp:16:16: error: variable or field 'PrintChar' declared void
 void PrintChar(char_type ch)
                ^~~~~~~~~
concepts.cpp:16:16: error: 'char_type' was not declared in this scope
concepts.cpp:16:16: note: suggested alternative: 'wchar_t'
 void PrintChar(char_type ch)
                ^~~~~~~~~
                wchar_t
concepts.cpp: In function 'int main()':
concepts.cpp:23:2: error: 'PrintChar' was not declared in this scope
  PrintChar('c');
  ^~~~~~~~~

должны ли поддерживаться два синтаксиса? или я использую устаревший или удаленный синтаксис с одним компилятором, в то время как другой не поддерживает его?

Ответы [ 2 ]

4 голосов
/ 14 марта 2020

Синтаксис с bool является не C ++ 20 концепциями, а синтаксисом предыдущих Концепций TS (Техническая спецификация). Последний является экспериментальным расширением C ++ 17, заменен дополнениями концепций C ++ 20, которые основаны на TS, но внесли некоторые изменения в синтаксис и семантику.

G CC 8 поддерживает только TS, а не концепции C ++ 20, для последних вам нужна G CC 10.

См. эту страницу cppreference.com для документации дополнений к концепциям C ++ 20 и это для Концепции TS. См. Также на этой странице для получения списка поддерживаемых компилятором концепций (TS и C ++ 20).

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

Как говорит walnut , concept bool был синтаксисом TS, а concept - синтаксис C ++ 20.

Если вам действительно требуется поддержка обоих компиляторов, вы можете использовать макрос тестирования функции , чтобы выбрать правильный синтаксис (хотя технически TS Concepts не указан в эта таблица):

#if __cpp_concepts >= 201707
  // working paper, C++20 concepts
  #define CONCEPT concept
#else
  // TS
  #define CONCEPT concept bool
#endif

template <typename T>
CONCEPT C = true;

Это будет работать во всех компиляторах, которые поддерживают концепции.

...