Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
#1

Соответствует ли код стандарту? - C++

15.02.2013, 10:11. Просмотров 1110. Ответов 17
Метки нет (Все метки)

Привет!
Имеется следующий код (в очень урощенном виде)
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct foo {};
 
int main()
{
  struct foo {};
 
  void f() throw (foo);
  
  return 0;
}
 
void f() throw (foo) {}
g++ и clang его компилируют, а компилятор Intel выдает следующее
Bash
1
2
3
4
5
6
7
8
Compilation finished with errors:
source.cpp(12): error: exception specification is incompatible with that of previous function "f" (declared at line 7):
            previously omitted: "foo"
            previously specified but omitted here: "foo"
  void f() throw (foo) {}
           ^
 
compilation aborted for source.cpp (code 2)
со своим английским не смог найти в стандарте информацию конкретно по этому вопросу.
Хотелось бы услышать ваши мысли по этому поводу.

Добавлено через 19 часов 43 минуты
и еще вот
C++
1
2
3
4
5
6
7
8
9
class A {};
class : public A {
};
 
 
int main()
{
   return 0;
}
g++ и clang не компилируют (error: abstract declarator ‘<anonymous class>’ used as declaration), а Intel выдает варнинг
Bash
1
2
source.cpp(4): warning #64: declaration does not declare anything
  class : public A {
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2013, 10:11     Соответствует ли код стандарту?
Посмотрите здесь:

какому стандарту С++ соответствует minGW - Кроссплатформенная разработка
Здравствуйте! У меня возникла такая проблема: я сейчас изучаю С++ и компилирую программы с помощью компилятора minGW. В книге дошел до...

насколько это соответствует стандарту? - C++
#include &lt;iostream&gt; class shit { private: int x; public: shit(){} shit(int p) { x = p; } void set (int*...

Как писать код по стандарту - C++
Извините, что создал тему скорей всего в неподходящей ветке. Но все же. Где-то читал (к сожалению не помню где) как нужно писать код по...

Инициализация по стандарту C++11 - C++
Здравствуйте ув. форумчане. Читаю Прата С. Язык программирования С++ Лекции и упражнения 2012. В разделе &quot;Инициализация в C++11&quot;,...

Последняя официальная документация по стандарту СРР - C++
Кто знает, где обитает последняя официальная документация по стандарту СРР ?

Сконвертировать простую математическую формулу по стандарту С++ - C++ Builder
Здравствуйте господа.Имеется формула.Учитель мало объяснял как подробно преобразовать форму и каждый её компонент. Кто сможет...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.02.2013, 13:21     Соответствует ли код стандарту? #2
C++
1
2
A class-specifier whose class-head omits the class-head-name defines an unnamed class. [ Note: An
unnamed class thus can’t be final. — end note ]
Впринципе единственное существенное по второму вопросу... Мне что-то подсказывает, что unnamed класс не создавая сразу же объект данного класса объявить нельзя.

Первый вопрос:
An exception-specification shall appear only on a function declarator for a function type, pointer to function
type, reference to function type, or pointer to member function type that is the top-level type of a declaration
or definition, or on such a type appearing as a parameter or return type in a function declarator.
Так-то декларация у нас в main-е, следовательно там нужен exception specification, а вот в реализации пофиг уже на него.
Хотя вот чуть дальше есть такое:
If any declaration of a function has an exception-specification that is not a noexcept-specification allowing
all exceptions, all declarations, including the definition and any explicit specialization, of that function shall have a compatible exception-specification.
Если поменять пример (перенести декларацию foo из мейна, то gcc/clang начинают ворнить на эту тему, что логично, судя по данному параграфу)... Попробую понять почему при локальной декларации все ок...
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
18.02.2013, 14:19  [ТС]     Соответствует ли код стандарту? #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Мне что-то подсказывает, что unnamed класс не создавая сразу же объект данного класса объявить нельзя.
Вот мне тоже что-то подсказывает, но в стандарте не смог это найти, более того я вообще не смог найти словосочетание "anonymous class" (почему anonymous а не unnamed? потому что говоря например про union в стандарте используется именно anonymous)
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
18.02.2013, 17:35     Соответствует ли код стандарту? #4
Про второму вопросу:
http://stackoverflow.com/questions/3...nnamed-classes
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.02.2013, 09:26     Соответствует ли код стандарту? #5
Я капитально заинтересовался первым вопросом, что-то мне подсказывает, что это баг, но увидим. В любом случае:
http://stackoverflow.com/questions/1...realisation-of
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
19.02.2013, 10:23  [ТС]     Соответствует ли код стандарту? #6
Somebody, не совсем понял суть написанного по ссылке, можешь пояснить?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.02.2013, 11:00     Соответствует ли код стандарту? #7
In such
cases, and except for the declaration of an unnamed bit-field (9.6), the decl-specifier-seq shall introduce one
or more names into the program, or shall redeclare a name introduced by a previous declaration. [ Example:
C++
1
2
enum { }; // ill-formed
typedef class { }; //ill-formed
simple-declaration:
decl-specifier-seqopt init-declarator-listopt ;

decl-specifier:
storage-class-specifier
type-specifier

type-specifier:
trailing-type-specifier
class-specifier
enum-specifier

class-specifier:
class-head { member-specificationopt }

class-head:
class-key attribute-specifier-seqopt class-head-name class-virt-specifieropt base-clauseopt
class-key attribute-specifier-seqopt base-clauseopt

class-head-name:
nested-name-specifieropt class-name
Таким образом, если используется simple-declaration, декларация, ежели она не является bit-field должна вводить/переопределять некое имя в программу.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
19.02.2013, 11:55     Соответствует ли код стандарту? #8
Кстати, enum {}; g++ переваривает даже без warning'а.
Меня заинтересовал пример
C++
1
typedef class qq {};
Если я правильно понял, typedef, как decl-specifier, тут не мешает, хотя и не имеет смысла?
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
19.02.2013, 11:57  [ТС]     Соответствует ли код стандарту? #9
ForEveR, т.е. Intel компилятор в данном случае неправ? Или частично неправ?

Добавлено через 1 минуту
Цитата Сообщение от Somebody Посмотреть сообщение
Кстати, enum {}; g++ переваривает даже без warning'а.
anonymous union как раз разрешены стандартом (да и частенько так и используются).
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.02.2013, 11:59     Соответствует ли код стандарту? #10
Kastaneda, http://software.intel.com/en-us/arti...s-union-fields
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
19.02.2013, 11:59  [ТС]     Соответствует ли код стандарту? #11
Цитата Сообщение от Somebody Посмотреть сообщение
Если я правильно понял, typedef, как decl-specifier, тут не мешает, хотя и не имеет смысла?
Ну да, синтаксически валидная конструкция, но смысла нет.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.02.2013, 11:59     Соответствует ли код стандарту? #12
Kastaneda, anonymous union и unnamed enum это как бэ разные вещи, не?
Не тему gcc и unnamed enum: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54216
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
19.02.2013, 12:10  [ТС]     Соответствует ли код стандарту? #13

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, anonymous union и unnamed enum это как бэ разные вещи, не?
блиин, да, гоню я)



Добавлено через 6 минут
Хм, вот что интересно, вот это компилится в gcc
C++
1
2
3
4
struct N { 
   struct { // Nonstandard anonymous union. 
   }; 
 };
а вот это нет
C++
1
2
class {
};
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.02.2013, 12:14     Соответствует ли код стандарту? #14
Kastaneda, Ага. Только что читал про это. http://gcc.gnu.org/onlinedocs/gcc/Un...Unnamed-Fields

Добавлено через 42 секунды
Bash
1
2
forever@pterois:~/My_pro1/cpp_pro$ g++ -o new new.cpp -Wall -pedantic
new.cpp:1:20: предупреждение: в ISO C++ анонимные структуры запрещены [-pedantic]
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
19.02.2013, 13:20  [ТС]     Соответствует ли код стандарту? #15
Ну хоть что-то прояснилось) Да я тут regression testsuite для компилятора ваяю, иногда натыкаюсь на интересные вещи, типа этого.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
20.02.2013, 18:03  [ТС]     Соответствует ли код стандарту? #16
Вот еще инетересный код, gcc и clang на нем падают, а Intel выдает warning, хотя код, как мне кажется, абсолютно валидный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A {
public:
        A() {};
};
 
class B : private A {
public:
        B() : A() {}
};
 
class C : public B {
public:
        C() : B() {}
 
private:
        A a; // компилятор ругается на это, т.к. A is private
};
 
 
int main()
{
        C c;
}
Добавлено через 1 час 58 минут
Хм, приехал домой, пропробовал с студии скомпилить, и она тоже выдала ошибки (хотя она вообще все компилит). У меня начинают появлятся сомнения по поводу корректности данного кода.
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 1
20.02.2013, 18:39     Соответствует ли код стандарту? #17
Cтандарт, 9.0.2:
2 A class-name is inserted into the scope in which it is declared immediately after the class-name is seen. The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name. For purposes of access checking, the injected-class-name is treated as if it were a public member name.
И в 11.1.5 такой пример есть:
5 [ Note: In a derived class, the lookup of a base class name will find the injected-class-name instead of the name of the base class in the scope in which it was declared. The injected-class-name might be less accessible than the name of the base class in the scope in which it was declared. —end note ]
[ Example:
C++
1
2
3
4
5
6
class A { };
class B : private A { };
class C : public B {
A *p; // error: injected-class-name A is inaccessible
::A *q; // OK
};
Добавлено через 6 минут
Получается, что A находится как injected-class-name, а оно private.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.02.2013, 18:56     Соответствует ли код стандарту?
Еще ссылки по теме:

Системные вызовы согласно стандарту POSIX - C++ Linux
Дайте, плз, ссылку на список системных вызовов согласно POSIX или сам (переведённый) стандарт. PS Гугление результатов не дало ((

Адаптация куска кода, написанного по стандарту C++11, под стандарт C++03 - C++
есть код namespace cmd { inline auto get_size(const char *path) -&gt; decltype( std::declval&lt;struct dSTATE64&gt;().st_size ) ...

Пример динамического двумерного массива по стандарту C++, располагающегося в монолитном участке памяти - C++
Помогите пожалуйста привести пример динамического двумерного массива n на m в понимании стандарта Си++, так чтобы он весь располагался в...

Число 65,41 представлено у форматі чисел із плаваючою крапкою стандарту IEEE 754 з одинарною точністю - C++
Число 65,41 представлено у форматі чисел із плаваючою крапкою стандарту IEEE 754 з одинарною точністю. Наведіть двійкове подання експоненти...


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
20.02.2013, 18:56  [ТС]     Соответствует ли код стандарту? #18
Я просто руководствовался логикой - A самостоятельный тип, по идее ничего не мешает объекту этого типа быть членом другого класса. То, что он учавствует в наследовании, вроде как совершенно по боку (как кажется).

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
То, что он учавствует в наследовании, вроде как совершенно по боку (как кажется).
А, ну да, только сейчас пример разглядел
C++
1
::A *q; // OK
с++ такой с++
Yandex
Объявления
20.02.2013, 18:56     Соответствует ли код стандарту?
Ответ Создать тему
Опции темы

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