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

Bug компилятора с++ Visual Studio 2015? Или undefined behavior ?

05.06.2019, 14:25. Показов 1528. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Наткнулась на одну любопытную штуку.

Оказывается typedef можно объявлять повторно!
У них иммунитет против множественного объявления.

Можно делать вот так:

C++
1
2
3
4
// по нескольку раз объявлять одно и тоже
using type = int;
using type = int;
using type = int;
Ошибка компиляции будет только если повторный алиас отличается от предыдущего.

Где можно об этом почитать?
Кто ни будь может привести цитату из стандарта,
где об этом написанно?

А то может на самом деле так делать нельзя?
Может быть такое использование - UB?


Теперь о проблемах.
Следующий код успешно компилируется на всех трех компиляторах (gcc/clang/cl):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <type_traits>
 
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
 
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
 
int main()
{
    volatile degradate<int> v{3};
    (void) v;
}
Смущает, что компилятор cl (msvc2015 update 1) делает предупреждение:
Code
1
warning C4700: uninitialized local variable 'v' used
Диагностика не соответствует реальному положению дел,
ведь переменная в коде явным образом инициализирована.

Если закомментировать повторный алиас:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <type_traits>
 
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
/*
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
*/
 
int main()
{
    volatile degradate<int> v{3};
    (void) v;
}
Компилятор перестает делать ложное предупреждение.


Дальше - ещё интереснее.

Следующий код успешно собирается gcc/clang
С компилятором msvc2015 update 1 творится что-то очень странное:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>     // <--- просто добавляем ещё один заголовок
#include <type_traits>
 
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
 
    template<class t> 
    using degradate = ::std::remove_cv_t<
        ::std::remove_reference_t<t> 
    >;
 
int main()
{
    degradate<int> v = 3;
    (void) v;
}
Code
1
2
3
4
5
6
7
8
9
10
11
Error(s):
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocnum(1341): error C2065: '_Buf': undeclared identifier
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocnum(1338): note: while compiling class template member function 'std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t>> std::num_put<wchar_t,std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t>>>::do_put(_OutIt,std::ios_base &,_Elem,const void *) const'
        with
        [
            _OutIt=std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t>>,
            _Elem=wchar_t
        ]
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocnum(1573): note: see reference to class template instantiation 'std::num_put<wchar_t,std::ostreambuf_iterator<wchar_t,std::char_traits<wchar_t>>>' being compiled
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocnum(1342): error C2065: '_Buf': undeclared identifier
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
Если закомментировать повторный алиас, ошибка пропадает.


То ли использование повторного алиаса приводит к UB,
то ли мелкомягкие опять накосячили...

Не понятно, легально ли использовать повторные алиасы,
или это - UB ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2019, 14:25
Ответы с готовыми решениями:

Bug компилятора с++ Visual Studio 2017?
Всем привет! Продолжаю экспертизу Google Mock. Разломалась сборка юнит-тестов, которая поставляется вместе с фреймворком, и...

Совместимость компилятора 2015 с visual studio 2010
Сталкивался ли кто-то из здесь присутствующих с проблемой компиляции программы написанной в 2015 в studio 2010 (программа написана на языке...

Visual Studio 2015 или Embarcadero RAD Studio 10.1 Berlin (C++ Builder)
Хочу &quot;поковыряться&quot; (так сказать пощупать его руками) в С++ вот и возник вопрос какую IDE выбрать Visual Studio 2015 или Embarcadero RAD...

1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2019, 14:35
Лучший ответ Сообщение было отмечено eva2326 как решение

Решение

Цитата Сообщение от eva2326 Посмотреть сообщение
Где можно об этом почитать?
Кто ни будь может привести цитату из стандарта,
где об этом написанно?
http://www.open-std.org/jtc1/s... /n4606.pdf
7.1.3 The typedef specifier

In a given non-class scope, a typedef specifier can be used to redefine the name of any type declared in that
scope to refer to the type to which it already refers. [ Example:
typedef struct s { /∗ ... ∗/ } s;
typedef int I;
typedef int I;
typedef I I;
— end example ]
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2019, 14:35
Помогаю со студенческими работами здесь

Ошибка или баг Visual Studio 2015?
Кто сталкивался с проблемой когда после сборки программы, зависает Visual? Даже пустой проект не может запустить, хотя раньше запускал....

Установка C++ Redistributable Visual Studio 2017 и Visual C++ для Visual Studio 2015
Доброго дня. Пытаюсь изучить PHP. Решил установить сервер локальный. В инструкции сказано: &quot;Ещё нам нужен файл C++...

Какая среда лучше: Visual Studio 2015 или 2017?
Стоит ли переходить на 17-ю вижлу? Стоит ли она того, чтобы качать почти 30 гигов? Или связка 15-я вижла + решарпер будет хорошим решением?

Имеются ли отличия в компиляторах у сред разработки Visual Studio 2006 и Visual Studio 2015 ?
скажите а где найти среду 2006 года? или можно использовать 2015 год?

Bug компиляторов Visual Studio?
Всем привет! ------------------------------------------------------------------------------------ Вкратце суть: Готовлю...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru