884 / 340 / 78
Регистрация: 17.05.2015
Сообщений: 1,095
1

bug gcc? SFINAE std::void_t idiom not worked

30.04.2021, 14:41. Показов 598. Ответов 0

Всем привет!

Как это можно починить?

https://rextester.com/LZWVZ9621

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <type_traits>
//=========================================
 
template<class, class = void>
struct begin : ::std::false_type {};
 
template<class t> struct begin<t,
        ::std::void_t<decltype(::std::declval<t>().begin())>
    > : ::std::true_type 
{};
 
//=========================================
 
class container
{
    void begin() ;
    void begin() const;
public:
    container();
};
static_assert(begin<container>::value, "bug");
 
#include <iostream>
int main()
{
    std::cout << "[ALL TESTS PASSED]\n";
}
Код
181265916/source.cpp: In instantiation of ‘struct begin<container>’:
181265916/source.cpp:22:31:   required from here
181265916/source.cpp:11:1: error: ‘void container::begin()’ is private within this context
 {};
 ^
В Visual Studio такая же проблема существует до msvc2015.
Но начиная с msvc2015 SFINAE работает корректно.
То есть, поведение в компиляторах VS корректно, начиная с офф. поддержки с++11.

Отсюда вопрос: в данном случае это - баг в gcc?
Или это корректное поведение старых компиляторов gcc?

На регекстере стоит gcc 7.4.0.
Я обнаружила эту проблему на gcc 8.1.0

Если я правильно понимаю, то std::void_t требует с++17
Но в том то и дело, что указанные выше компиляторы уже поддерживают этот стандарт:

https://rextester.com/GKJCO93022
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
int main()
{
    std::cout << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__ << '\n';
    
    #if defined(__cplusplus) && __cplusplus >= 201103L
        std::cout << "c++11: enabled\n";
    #endif
 
    #if defined(__cplusplus) && __cplusplus >= 201402L
        std::cout << "c++14: enabled\n";
    #endif
 
    #if defined(__cplusplus) && __cplusplus >= 201703L 
        std::cout << "c++17: enabled\n";
    #endif
 
    #if defined(__cplusplus) && __cplusplus >= 202002L  
        std::cout << "c++20: enabled\n";
    #endif
}
Код
7.4.0
c++11: enabled
c++14: enabled
c++17: enabled
Получается, что в gcc баг, который присущ компиляторам эпохи с++0x
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2021, 14:41
Ответы с готовыми решениями:

bug msvc2013 ? SFINAE std::void_t idiom not worked
Всем привет! Кто ни будь знает, почему в Visual Studio 2013 не работает идиома std::void_t ? ...

bug msvc2019 ? __if_exists not worked
Всем привет! Следующий код вызывает внутреннею ошибку в компиляторе msvc2019 #ifdef...

bug msvc2015 ? using-declaration not worked
Всем привет! Следующий код не вызывает проблем у mingw, и у студий, начиная с msvc2017:...

[SFINAE] GCC/Clang - success. CL - failed
добрый вечер. следующий код успешно собирают gcc/clang но не может собрать cl (компилятор...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.04.2021, 14:41

GCC/Clang bug
Пытаюсь разбить строку на токены при помощи массива указателей и strtok. Вот рабочий и неправильный...

bug in gcc compilers с++: does not suppress warning Wundef
Всем привет! Как подавить предупреждение ??? https://rextester.com/TOTTNQ30667 #include...

[xvalue][msvs/gcc][bug] member function with ref-qualifier
добрый вечер. следующий код работает как и ожидается. и прекрасно компиляется gcc: ...

Bug msvc2010 ? error C2752: std::tr1::_Remove_reference<_Ty>
Привет) Сегодня баг поинтереснее)) Компиляторы msvc2010 не умеют правильно обращаться с типами...

gcc -std key
============================================================== -std= какие параметры здесь можно...

Отсутствует std::unique_ptr gcc 4.8.1
всем привет , я в С++ начинающий и возникла проблема не работает std::unique_ptr версия...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.