1562 / 481 / 105
Регистрация: 17.05.2015
Сообщений: 1,467
1

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

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

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

Оказывается 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) делает предупреждение:
Код
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;
}
Код
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2019, 14:25
Ответы с готовыми решениями:

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

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

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

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

1
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.06.2019, 14:35 2
Лучший ответ Сообщение было отмечено 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
05.06.2019, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2019, 14:35
Помогаю со студенческими работами здесь

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

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

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

Bug компиляторов Visual Studio?
Всем привет! ------------------------------------------------------------------------------------...

Install Shield 2015 и Visual Studio 2015 Community
Как в Visual Studio 2015 Community интегрировать Install Shield что можно было создавать не...

Ошибка при установке Visual Studio Community 2015: Пакет установки отсутствует или поврежден


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru