Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518

bug msvc2015? trailing syntaxis for auto (since C++11)

08.02.2021, 17:04. Показов 1660. Ответов 1

Студворк — интернет-сервис помощи студентам
Всем привет!

Поведение msvc2015 - это баг?
Или это - корректное поведение с++11, которое изменилось начиная с с++14?
-----


trailing syntaxis for auto - это синтаксис вида: auto foo() -> int

Тип возвращаемого значения указывается в конце объявления функции, а не в начале.
Благодаря чему, становится возможным определить тип возвращаемого значения через имя аргумента:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct record
{
    char name[32];
};
 
template<class t>
auto foo(const t& v) -> decltype((v.name))
{
    return v.name;
}
 
#include <iostream>
 
int main()
{
    record rec { "Asya" };
    std::cout << foo(rec) << '\n';
}

Если использовать совместно с SFINAE, то можно изготавливать "концепты".
Концепт - это способ ввести ограничения для параметра шаблона.
Благодаря чему становится возможным реализовать различную логику в зависимости от свойств типов.
Например:

https://rextester.com/ZKWZ68876

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
#include <iostream>
#include <string>
 
void can_be_converted_to_integer(int);
 
template<class t>
auto concept(t&& v) -> decltype( can_be_converted_to_integer(v) )
{
    // инстанцируется только для совместимых с int аргументов
    std::cout << "can be converted to integer type\n";
}
 
template<class t>
auto concept(t&& v) -> decltype( v.c_str(), void() )
{
    // инстанцируется только для классов строк
    // (у которых есть метод c_str)
    std::cout << "string type (has c_str)\n";
}
 
int main()
{
    std::string v;
    concept(1);
    concept(v);
}
Обратите внимание: концепты можно реализовывать без применения тяжелых заголовков type_traits.


Но вот незадача: данный подход не работает в msvc2015
Code
1
2
3
source_file.cpp(16): error C2995: 'unknown-type concept(t &&)': function template has already been defined
source_file.cpp(7): note: see declaration of 'concept'
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
Такое впечатление, что компилятор сначала рассматривает только фрагмент декларации:
template<class t> auto concept(t&& v)
И видит два одинаковых шаблона.

Тип возвращаемого значения не входит в сигнатуру функции.
Поэтому, во что бы в итоге ни раскрылся бы auto, с точки зрения компилятора - это всё равно две одинаковые сигнатуры.
А двух одинаковых сигнатур быть не должно.
То, что одна из этих перегрузок отвалится по SFINAE, об этом компилятор не думает.

Можно было бы решить, что компилятор прав, вот только для шаблонов функций, тип возвращаемого значения входит в сигнатуру:
The signature of a function template additionally includes its return type and its template parameter list.
Поэтому, я больше склоняюсь к мысли, что это просто очередной баг в компиляторах msvc2015.
Более современные компиляторы (clang/gcc и Visual Studio более поздних версий) адекватно реагируют.
И код успешно компилируется.

Вопросы:
Поведение msvc2015 - это баг?
Или это - корректное поведение с++11, которое изменилось начиная с с++14?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.02.2021, 17:04
Ответы с готовыми решениями:

Некорректно работают функции Auto-Tone, Auto contrast, Auto color
Не корректно работают функции Auto-Tone, Auto contrast, Auto color. Вот пример (как на картинке). То есть оно какбы что-то делает и,...

Streaming cluster replication bug or ne bug
Как только оно появилось с версии 8.5х - так сразу его рекомендовали отключить через DEBUG_SCR_DISABLED=1 )) Ну и было отключено. Думаю...

[Eclipse] Trailing Spaces
Почему ChechStyle ругается, что в коде trailing spaces(когда на пустых строках есть табы/пробелы). Это связано с тем, что исходный код...

1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
08.02.2021, 23:28
https://devblogs.microsoft.com... nsupported
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.02.2021, 23:28
Помогаю со студенческими работами здесь

Компилятор MSVC2015 не компилирует проекты
Всем привет! У меня такая проблема, QT не компилирует ни один проект(компилятором MSVC2015), ругается на все заголовочные файлы стандартной...

Не собирается проект под MSVC2015
Всем привет! В общем, есть вот такой небольшой пример: conanfile.txt Qt/5.11.0@bincrafters/stable ...

Где взять дебагер для msvc2015
Не могу найти дебагер msvc2015 для кьюта, на сайте майкрософта есть windows developers kits 8.1 - msvc2012 и developers kits 10...

Samsung R40 проклят? Древний ноутбук и Qt (с MSVC2015)
Всем привет. Ранее создавал тему: https://www.cyberforum.ru/qt/thread1975556.html Решил поставить Windows 10 на ноут, так как на...

Msvc2015 специализация шаблона для массива нулевого размера
здарова. по стандарту с++, массивы нулевой длины запрещены. warning: ISO C++ forbids zero-size array тем не менее, компиляторы...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru