Вопросы с тегами [language-lawyer]

1

голосов
2

ответ
77

Просмотры

Почему не работает называть именующее выражение

Это должно быть довольно очевидно, но я не мог любой нормативно-справочный в стандарте явно, что вызов функции (не) именующий. Существует несколько связанного вопрос, но речь идет о C ++ и никаких ссылок не предусмотрена. Просматривая 6.5.2.2 (p5) Функция вызывает только я мог бы найти, если выражение, которое обозначает вызываемой функции имеет тип указатель на функцию, возвращающую тип объекта, выражение вызова функции имеет тот же тип, что и тип объекта, и имеет значение определяется, как указано в 6.8.6.4 6.3.2.1 (p1) утверждает, что именующее выражение является выражением (с типом объекта другой thanvoid), что potentiallydesignates объект так что я пытался найти, если вызов функции обозначает объект. Не указано в стандарте, если результат вызова функции имеет срок хранения и срок службы. Так как любой объект имеет срок хранения и срок службу я пришел к выводу, что любое выражение вызова функции не обозначает объект, следовательно, не в именующем выражение. Но это кажется запутанным и сложным. В частности, я нашел пример 6.5.2.3 (Р7): Пример 1 Если F представляет собой функцию, возвращающую структуру или объединение, и х является членом этой структуры или объединения, F () х является допустимым выражением постфикса, но это не так. именующий. Судя по этому примеру, если F () будет именующим п (). Х будет также именующей. Но примеры являются информативными, которые заставили меня запутался. F (). х является допустимым выражением постфикса, но не именующий. Судя по этому примеру, если F () будет именующим п (). Х будет также именующей. Но примеры являются информативными, которые заставили меня запутался. F (). х является допустимым выражением постфикса, но не именующий. Судя по этому примеру, если F () будет именующим п (). Х будет также именующей. Но примеры являются информативными, которые заставили меня запутался.
Some Name
3

голосов
1

ответ
17

Просмотры

станд :: is_constructible на неполном типа

У меня есть следующий код: #include класса А; ИНТ основной () {станд :: соиЬ
R_Kapp
1

голосов
2

ответ
107

Просмотры

C minimal standard requirement

От C Стандарт ISO / IEC 9899: 201x 5.1.2.3p6: Наименее требование в соответствующей реализации является: Доступы к летучим объектам оцениваются строго в соответствии с правилами абстрактной машины. По завершению программы, все данные, записанные в файлы должны быть идентичны, в результате чего выполнения программы в соответствии с абстрактной семантикой бы производством. Динамика ввода и вывода интерактивных устройств, должны иметь место, как указано в 7.21.3. Цель этих требований заключается в том, что небуферизован буферизации строк или выход появляется как можно скорее, чтобы гарантировать, что побуждающие сообщения на самом деле появляются перед программой, ожидая ввод. Это наблюдаемое поведение программы. Смысл этого пункта является весьма драматичным (по крайней мере для меня), то, как я понимаю, этот пункт гласит, что: (1) Составитель, которые производят такое же наблюдаемое поведение, равно как и в полностью соответствующих стандартах абстрактной машину продукт, является соответствующим компилятором, который означает, что все другие требования и пункты в стандарте только дополнительные (кроме участков летучих веществ и 7.21.3), например, соответствующий компилятор может фактически нарушать правила порядка из-оценок (а && Ь), если наблюдаемое поведение (летучие вещества, файлы контента и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? Как и в полностью соответствующих стандартах абстрактной машины продукт, является соответствующим компилятором, который означает, что все другие требования и пункты в стандарте только дополнительные (кроме разделов летучих веществ и 7.21.3), например, соответствующий компилятор может на самом деле нарушают правила оценки порядка из-(а && Ь), если наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? Как и в полностью соответствующих стандартах абстрактной машины продукт, является соответствующим компилятором, который означает, что все другие требования и пункты в стандарте только дополнительные (кроме разделов летучих веществ и 7.21.3), например, соответствующий компилятор может на самом деле нарушают правила оценки порядка из-(а && Ь), если наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? Это означает, что все другие требования и пунктов в стандарте только дополнительные (кроме разделов летучих веществ и 7.21.3), например, соответствующий компилятор может фактически нарушать правила порядка из-оценок (а && б) до тех пор, как наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? Это означает, что все другие требования и пунктов в стандарте только дополнительные (кроме разделов летучих веществ и 7.21.3), например, соответствующий компилятор может фактически нарушать правила порядка из-оценок (а && б) до тех пор, как наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? например, соответствующий компилятор может фактически нарушать правила оценки порядка из-(а && Ь), если наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? например, соответствующий компилятор может фактически нарушать правила оценки порядка из-(а && Ь), если наблюдаемое поведение (летучие вещества, содержание файлов и интерактивный вывод) является правильным. (Не 2) Программа, которая не имеет летучих веществ, не записывает в файлы и не имеет ввода-вывода интерактивной, это программа, которая на самом деле ничего не делает, не имеет никакого наблюдаемого поведения и может быть полностью оптимизирована, например, два наставления исключающего EAX, EAX, чем Ret (x86-64 звоном 7.0.0) в основном. Я прав, или далеко по этому поводу? не имеет никакого наблюдаемого поведения и может быть полностью оптимизирован, чтобы, к примеру, два наставления исключающего EAX, EAX, чем RET (x86-64 звона 7.0.0) в основном. Я прав, или далеко по этому поводу? не имеет никакого наблюдаемого поведения и может быть полностью оптимизирован, чтобы, к примеру, два наставления исключающего EAX, EAX, чем RET (x86-64 звона 7.0.0) в основном. Я прав, или далеко по этому поводу?
user2162550
1

голосов
1

ответ
49

Просмотры

Введите каламбурная положительное целое число в беззнаковое (и наоборот)

объединение Positive_Small {int8_t с; uint8_t и; }; объединение Positive_Small х = {.s = 3}; Объединение Positive_Small у = {.u = 4}; утверждают (Xu == 3); утверждают (YS == 4); Является ли это определено поведение? Гарантирует ли стандарт, что положительный диапазон знакового интегрального типа имеет такое же представление, как его эквивалент знака? Я полагаю, что нет реализации достаточно ума (DS9K может быть?), Чтобы не делать этого, но определяется как это?
Cacahuete Frito
1

голосов
1

ответ
70

Просмотры

Неявные преобразования функция-указатель

Эмпирически на TCC, GCC и лязгом, указатель на функцию старого стиля возвращающегося RetTp и указатель на любой прототип функции, возвращающей RetTp взаимно неявно преобразованы друг к другу: // компилируется без предупреждений TYPEDEF недействительным RetTp; RetTp oldfn () {}; RetTp newfn (интермедиат Х) {}; RetTp (* oldfnp) () = newfn; RetTp (* newfnp) (интермедиат X) = oldfn; Есть ли в стандарте C, что гарантирует такое поведение или это просто расширение?
PSkocik
1

голосов
0

ответ
108

Просмотры

C99 с плавающей точкой промежуточные результаты

В соответствии со стандартом C99: 6.3.1.8.2: значения плавающих операндов и результатов плавающих выражений могут быть представлены в большей точности и диапазоне, чем требуется по типу; типы не изменяются thereby.52)> Однако, за рамки приложения F, мы имеем: 5.2.4.2.2.7: Значения операций с плавающими операндами и значения с учетом обычных арифметических преобразований и плавающие констант оцениваются в формат которого диапазон и точность может быть больше, чем требуется по типу. Использование форматов оценки характеризуется реализацией определяется значением FLT_EVAL_METHOD: 19) где FLT_EVAL_METHOD может быть: -1: неопределимы 0: оценить все операции и константы только в пределах и точности типа 1: оценки операций и константы типа поплавка и дважды в диапазон и точности двойного типа, оценивать длинные двойные операции и константы в диапазон и точности длинного двойного типа 2: оценить все операции и константы в диапазон и точности длинного двойной тип. Таким образом, для соответствующей реализации, делает FLT_EVAL_METHOD == [0, 1, 2] отменяет 6.3.1.8.2? То есть, явные приведения типов и / или задания типа не требуется для обеспечения заданной ширины?
Kay
1

голосов
0

ответ
68

Просмотры

identity VS identifier in c++

When learning Value categories, the term identity confuses me. I know that identifier is well-defined in the standard: http://eel.is/c++draft/lex.name An identifier is an arbitrarily long sequence of letters and digits. But it doesn't define what is identity. Here lists several places identity occur: value category: A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function. linkage [6.5] (10.4) — when both names denote function templates, the signatures (17.6.6.1) are the same. 11 After all adjustments of types (during which typedefs (10.1.3) are replaced by their definitions), the types specified by all declarations referring to a given variable or function shall be identical, except that declarations for an array object can specify array types that differ by the presence or absence of a major array bound (11.3.4). A violation of this rule on type identity does not require a diagnostic. Identity conversions [23.17.7.9.5 ] Stack overflow tag: identifier (no one updates): An identifier is a name that identifies either a unique object or a unique class of objects. Stack overflow tag: identity: An inherent property of an entity that distinguishes that entity from all others. Frequently used to refer to user identity and authentication. Are the two terms the same? If they are, why standard doesn't use the same one? If they are not, what's the difference?
陳 力
1

голосов
1

ответ
40

Просмотры

Инициализация базовой части производного STRUCT / Неожиданные упаковки полученных полей структуры для выравнивания зазора базовой структуры

Было неожиданно обнаружено, что лязг ++ 7 позволяет себе плотно упаковать поля производного структуры (структура «B» с полем «B :: u16_gap» в приведенном ниже примере) в зазоре выравнивания базовой структуры (структура «А «). Но функция «zero_init» в примере ожидает, что это вход, чтобы быть «А» -объект с неиспользуемым зазором выравнивания, поэтому он может быть перезаписан «тетср». Эта функция «zero_init», конечно же, перезаписывает любое значение «B :: u16_gap» -поля, когда он применяется к «B» -объект. // сборник: лязг ++ - 7 -std = C ++ 17 test.cpp #include #include #include структура A {станд :: uint32_t u32 = 0; станд :: uint16_t u16 = 0; }; недействительный zero_init (А & а) {статические constexpr Нулевого = {}; станд :: тетср (& а, & нуль, SizeOf (А)); }; структура B: обществен {станд :: uint16_t u16_gap = 0; }; static_assert (SizeOf (А) == 8); static_assert (SizeOf (В) == 8); // лязг ++ - 7 упаковок дополнительное поле "Б :: u16_gap" в зазор выравнивания А (для г ++ - 7 это не так) INT основных () {B B; & А = Ь; b.u16_gap = 123; zero_init (а); станд :: соиЬ
Dr. Zoidberg
1

голосов
0

ответ
29

Просмотры

Поддержка paramref атрибута с тегом см

В Doxygen вопрос (к сожалению, довольно старый уже) говорится, что не обрабатывается вообще (см: https://github.com/doxygen/doxygen/issues/5111). Это правильно. Я посмотрел в самом последнем определении C # я мог бы найти: «Спецификация языка C #, 5th Edition / декабря 2017», но здесь я не мог найти какие-либо ссылки на атрибут paramref, я нашел paramref (и TypeRef) тег, но это совсем другое , Вопрос: paramref возможного атрибута для тега см (и, вероятно, seealso тега), и если да, то где я могу найти ссылку? (Обратите внимание, что я не программист C # отсюда вопрос).
albert
1

голосов
1

ответ
73

Просмотры

это decltype требуется в заднем возврат, используя значение типа аргумента

Пытаясь понять C ++ 17 совместимого код, я путать с помощью следующего кода, в котором функция использует значение из integral_constant типа аргумента в типе возвращаемого трейлинга. (Пожалуйста исправить мою terminolgy и т.д., пытаясь узнать) Два простых варианта приведены ниже, с и без decltype на аргумент в возвращении завершающим. Использование Компилятор Проводник https://godbolt.org/z/vqmzhu Первый (bool_from1) компилирует ОК на MSVC 15.8; / Станд: C ++ 17, / О2, / permissive- и лязг 8.7.0.0 и GCC 8.2; -std = C ++ 17, -O2, -pedantic с правильным выходом ассемблер Второй (bool_from2) ошибки вне на GCC, а также показывает Intellisense ошибки в VS но компилируется без ошибок. Я не мог найти что-нибудь в cppreference или стандартном проекте, и т.д., что указывало бы мне, что decltype (atype) потребуется для соответствующего кода, тем не мение...??? Мой вопрос был бы это decltype требуется. Являются ли мои флаги компилятора правильно для C ++ 17 проверки на соответствие. КОД: #include пространств имен нс {летучего BOOL VB; шаблон структура bool_: станд :: bool_constant {}; // использование decltype (BTYPE) в задней возврата составляет во всех 3 шаблона constexpr авто bool_from1 (Bool BTYPE) -> bool_ {возвращение bool_ {}; } Недействительными test1 () {static_assert (// простой тест bool_from1 (станд :: true_type {}) значение.); VB = bool_from1 (станд :: true_type {}) значение. // проверить вывод} // без decltype в заднем возврате компиляции в VS и звоне // но ошибки вне в GCC; и VS показывает Intelisense ошибки, но компилирует шаблон constexpr авто bool_from2 (Bool BTYPE) // ^ Gcc +8,2 ошибка: вывести тип класса 'bool_' в функции обратного типа -> bool_ {// ^ НКУ: неверный шаблон идентификатор; использование вне функции параметра Я тела перед «» // ^ VS Intellisense на BTYPE:; не параметр Я разрешен возвращение bool_ {}; } Недействительными test2 () {static_assert (bool_from2 (станд :: true_type {}) значение // ^ GCC:. Bool_from1 не был объявлен в этой области); VB = bool_from2 (станд :: true_type {}) значение. // проверить вывод}}
lec
20

голосов
2

ответ
570

Просмотры

Гарантированное распределение памяти для стандартной компоновки структуры с помощью одного элемента массива примитивного типа

Рассмотрим следующий простой структуры:-структуру A {данных с плавающей точкой [16]; }; Мой вопрос: Предположим, что платформу, где поплавок 32-бит IEEE754 число с плавающей точкой (если это имеет значение вообще), делает C ++ стандартная гарантия ожидаемый макет памяти для структуры A? Если нет, то это гарантирует и / или каковы пути для обеспечения соблюдения гарантий? По ожидаемой компоновке памяти я имею в виду, что структура занимает до 16 * 4 = 64 байта в памяти, каждый из последовательного 4 байта, занятого единым поплавком из массива данных. Другими словами, как ожидается распределение памяти означает, что следующий тест проходит: static_assert (SizeOf (А) == 16 * SizeOf (с плавающей точкой)); static_assert (offsetof (А, данные [0]) == 0 * SizeOf (с плавающей точкой)); static_assert (offsetof (А, данные [1]) == 1 * SizeOf (с плавающей точкой)); ... static_assert (offsetof (А, данные [15]) == 15 * SizeOf (с плавающей точкой)); (Offsetof является законным здесь, так как А стандартная раскладка, смотри ниже) В случае, если это беспокоит вас, тест на самом деле проходит на wandbox с GCC 9 HEAD. Я никогда не встречал сочетание платформы и компилятора, который будет предоставлять доказательства того, что этот тест может потерпеть неудачу, и я хотел бы узнать о них в случае, если они существуют. Почему бы один даже уход: SSE-подобные оптимизации требуют определенной раскладки памяти (и выравнивания, которые я игнорирую в этом вопросе, так как она может быть решена с помощью стандартного alignas спецификатора). Сериализация такой структуры просто сводится к симпатичному и портативному write_bytes (& х, SizeOf (А)). Некоторые API (например, OpenGL, в частности, скажем, glUniformMatrix4fv) ожидать, что это точное расположение памяти. Конечно, можно было бы просто передать указатель на массив данных, чтобы передать один объект этого типа, но для последовательности из них (скажем, для загрузки матрицы типа вершинных атрибутов) конкретный макет памяти по-прежнему необходим. Что на самом деле гарантировано: Это то, что, насколько мне известно, можно ожидать от структуры A: Это стандартное расположение Как следствие стандартности верстки, указатель А может быть reinterpret_cast к указателю на его первый элемент данных (что, по-видимому, данные [0]?), т.е. нет обивки перед первым элементом. Два оставшиеся гарантии, которые не являются (как мне известно), предусмотренными стандартом, являются: Там нет обивки между элементами массива примитивного типа (я уверен, что это неверно, но я не смог найти подтверждающую ссылку) , Там нет обивки после массива данных внутри структуру А. Это стандартное расположение Как следствие будучи стандартным макетом, указатель A может быть reinterpret_cast на указатель на его первый элемент данных (который, по-видимому, данные [0]?), Т.е. нет обивки перед первым элементом , Два оставшиеся гарантии, которые не являются (как мне известно), предусмотренными стандартом, являются: Там нет обивки между элементами массива примитивного типа (я уверен, что это неверно, но я не смог найти подтверждающую ссылку) , Там нет обивки после массива данных внутри структуру А. Это стандартное расположение Как следствие будучи стандартным макетом, указатель A может быть reinterpret_cast на указатель на его первый элемент данных (который, по-видимому, данные [0]?), Т.е. нет обивки перед первым элементом , Два оставшиеся гарантии, которые не являются (как мне известно), предусмотренными стандартом, являются: Там нет обивки между элементами массива примитивного типа (я уверен, что это неверно, но я не смог найти подтверждающую ссылку) , Там нет обивки после массива данных внутри структуру А.
lisyarus
1

голосов
1

ответ
46

Просмотры

Является ли документ неправильно о толковании \ xhh

Это из основного TCL документа: \ xhh шестнадцатеричные цифры чч дает восемь-разрядное шестнадцатеричное значение для символа Unicode, который будет вставлен. Любое количество шестнадцатеричных цифр может присутствовать; Однако, ** все, кроме двух последних, игнорируются ** (результат всегда количество один байт). Мои сомнения в этой части, все, кроме двух последних, игнорируются. Вот мой эксперимент:> установить «\ x22» «> установить„\ x2230“» 30 Таким образом, вы можете видеть, что это первые 2 шестнадцатеричные цифры берутся, а остальные просто рассматривается как обычный символ. Должна ли я что-то пропустил? [EDIT] Похоже, я прав, вот от parser.c из tcl8.6: 860 случай 'х' (? Р + 1, (numBytes> 3) 2: numBytes-2, и результат) +861 счета + = TclParseHex ; Таким образом, только будут сделаны первые непосредственные 2 цифры. Странно, как не пришел никто находит эту ошибку дока.
my_question
1

голосов
1

ответ
182

Просмотры

Параллельное разрушение объекта

Я misunderstandingn на сек. 3.6.3 / 1 N3797. Когда я рассмотрел правило инициализации я сталкиваюсь с концепцией копирования инициализации. Если завершение конструктора или динамической инициализация объекта со статической продолжительностью хранения секвенирует до этого другого, завершение деструктора второго секвенируют перед началом деструктора первых. [Примечание: Это позволяет определение одновременно destruction.- конец примечание] Возможно ли, что завершение деструкторов второго и первого в разных потоках?
1

голосов
1

ответ
173

Просмотры

Мутация изменяемых данных балки с помощью указателя на член

Стандарт обеспечивает следующее примечание: [Примечание: это не представляется возможным использовать указатель на элемент, который ссылается на изменяемом член изменить константный объект класса. Например, структура S {S (): I (0) {} изменяемые INT I; }; недействительными F () {Const S CS; INT S :: * ч = & S :: я; // вечер относится к изменяемому члену S :: я CS * ч = 88. // плохо сформированный: CS является константным объект} -End примечание] Но мы можем использовать только объектно-выражение для изменения константного объекта, имеющий элемент mutale данных. #include структура А {А () {} изменяемым Int А; }; Const А а; INT основных () {аа = 4; станд :: соиЬ
1

голосов
3

ответ
96

Просмотры

Может ли два объекта различных типов с различными требованиями alingment имеет такое же представление объекта?

Следующее определение представления объекта задается (3,9 / 4): Объект представление объекта типа Т представляет собой последовательность из N объектов символа без знака, принятых до объекта типа T, где N равно SizeOf (Т). Но 3.9.1 / 1 говорит: полукокс, подписанный символ, а символ без знака занимают одинаковое количество памяти и имеют то же требование к выравниванию (3.11); то есть, они имеют такое же представление объекта. Похоже, что представление объекта зависит от требований выравнивания. Но он не упоминается в определении, что я цитировал. Это два объекта одного и того же размера могут иметь различное представление объекта, не так ли? По сути, я спрашиваю о следующем: Предположим, у нас есть два объекта одинакового размера, так что выравнивание одного из что объекты отличается от другого. Например: STRUCT А {обугливается а; символ б; символ с; символ д; }; А а; // Объект 1. alignof (а) = 1 INT б; // Объект 2. alignof (б) = 4 ли эти объекты имеют такое же представление объекта?
42

голосов
3

ответ
2.5k

Просмотры

Почему не константная ссылка продлить срок временного объекта, переданный с помощью функции?

В следующем простом примере, почему не может ref2 быть связан с результатом мин (х, у + 1)? #include шаблон <Ьурепате Т> Т & Const мин (сопзЬ Т & а, сопзЬ Т & б) {возвращают <Ь? A: B; } INT основных () {INT х = 10, у = 2; Const INT & исх = мин (х, у); // ОК Const INT & ref2 = мин (х, у + 1); // НЕ ОК, ПОЧЕМУ? вернуться ref2; // компилировать вернуться 0} живого примера - производит: главный: исключающее EAX, EAX RET
11

голосов
4

ответ
305

Просмотры

Является ли преобразование reinterpret_cast'd полученный указатель класса на указатель базового класса непредсказуемое поведение?

Посмотрите на простой пример: структура Base {/ * некоторые виртуальные функции здесь * /}; структура A: База {/ * члены, переопределенные виртуальные функции * /}; структура B: База {/ * члены, переопределенные виртуальные функции * /}; недействительным п () {Аа; База * база = & а; В * Ь = reinterpret_cast (основание); База * х = Ь; // использование х здесь, вызов виртуальных функций на нем} ли этот маленький фрагмент кода имеют Неопределенное поведение? Reinterpret_cast хорошо определен, она возвращает неизменное значение базы, только с типом B *. Но я не уверен, о Базовом * х = Ь; линия. Он использует б, который имеет тип B *, но на самом деле указывает на объект A. И я не уверен, х является ли «правильный» указатель базы, будь то виртуальные функции могут быть вызваны с ним.
geza
12

голосов
2

ответ
301

Просмотры

Почему это статический константный переменная INT элемент появляется, чтобы быть доступными публично в определении массива?

Я делаю следующие объявления: класс Servo {защищенные: статический константный Int maxServos = 16; статические Servo сервоприводы [maxServos]; // Объявление массива}; Servo Servo :: сервоприводы [Servo :: maxServos]; // Определение массива ... и он компилирует, что это здорово! Но я не понимаю, почему он компилирует, потому что мне кажется, что maxServos защищена, и я использую его в глобальном масштабе, когда я определяю массив. Я пытался использовать его в другом глобальном контексте и на самом деле я получаю ошибку компиляции: Int основной () {зЬй :: COUT
user1759557
1

голосов
1

ответ
111

Просмотры

Термин `функция declaration` определяется в § 7/9 (N4140), но он не определен в качестве продукции грамматики. Зачем?

В § 7/9 вы найдете определение функции декларации: Если Децли-спецификатор-сло не содержит ЬурейеЕ спецификатор, объявление называется объявлением функции, если тип, связанный с именем типа функции (8.3.5 ) и описание объекта в противном случае. В § 7/1 вы можете найти определение декларации грамматики производства, но нет функции декларирования номинированный там, как часть этого определения. Другими словами, как бы одна классифицируют объявление функции в грамматике C ++?
Leon
1

голосов
2

ответ
72

Просмотры

У меня такое впечатление, что сноска 32 ниже, относится ко всему абзацу §3.4.1 / 8, а не только его третьей точка пулевога

32) Этот поиск применяется ли определена функция состоит в определении класса X или будут ли функция члена определяются в области видимости пространства имен, охватывающее определение на Й. Я прав?
Belloc
1

голосов
1

ответ
68

Просмотры

Требования (не-quite-) аргументов шаблона constexpr

Оба GCC (5.3.0) и Clang (3.8.0) согласен, что это правильный код: constexpr станд :: integral_constant п {}; станд :: получить (станд :: make_tuple (123)); Тем не менее, они не согласны с этим: станд :: integral_constant п; станд :: получить (станд :: make_tuple (123)); Clang нормально с ним, но сообщает GCC «значение„п“не может использоваться в постоянном выражении» / «„п“не был объявлен" constexpr». Чье поведение соответствует стандарту?
vpozdyayev
1

голосов
1

ответ
412

Просмотры

Функции поворота noexcept в C ++ 17?

В соответствии с этим ответом, спецификации исключений станут частью типа функции в C ++ 17. Означает ли это, что спецификации исключений для многих функций также будет меняться, например, функции в заголовках совместимости С, получающих noexcept спецификации? Какой стандарт функции будет их спецификация исключений изменена на noexcept в C ++ 17? EDIT: Видимо P0488R0, в 2016-10-19 национальный орган Комментарии к стандартному рабочему проекту, включает предлагаемые изменения, чтобы отметить несколько функций совместимости C noexcept (см US 172-178). Я думаю, мы должны ждать реакции от WG21 на них.
jotik
1

голосов
1

ответ
87

Просмотры

это ссылочное преобразование является стандартом преобразования

C ++ стандарт говорит стандартные преобразования включают в стандартной последовательность преобразования представляет собой последовательность стандартных преобразований в следующем порядке: (1.1) - Ноль или один преобразование из следующего набора: именующая к RValue преобразования, массив к указателю преобразование, и функцию -в-указатель преобразования. (1.2) - Ноль или один преобразование из следующего набора: интегральные акции, продвижение с плавающей точкой, интегральные преобразования, преобразование с плавающей точкой с плавающими интегральными преобразованиями, преобразование указателей, указатель на преобразования членов, и логические преобразования. (1.3) - Ноль или один квалификационное преобразование. Но это не metioned преобразования ссылки. Который используется widespreadly в C ++; как: автоматический ех = станд :: runtime_exception (); станд :: исключение & исй = ех; // ссылочного преобразования // ссылка на Derived converion ссылаться на базу в // оператора = вызов в объекте класс нарезки B {}; Класс D: В общественных {}; B B = д; Я не знаю, почему?
Jackson Zheng
1

голосов
1

ответ
94

Просмотры

Initialize static const member of a class, where the member is of a private type?

// gamewindow.hpp #include #include #include класс GameWindow: общественный С.Ф. :: RenderWindow {общественности: GameWindow (Const uint32_t &, Const uint32_t &, Const станд :: строка &); аннулированию ToggleFullscreen (); Статическая Const ResolutionSetting w640h480, w1600h900, w1920h1080, w2560h1440; частный: класс ResolutionSetting {общественность: ResolutionSetting (Const uint32_t & ширина, Const uint32_t и высота): Рез (ширина, высота) {} частное: научная фантастика :: Vector2u разрешение; }; станд :: строка _title; uint32_t _width; uint32_t _height; }; Я пытаюсь инициализировать объекты общественного ResolutionSetting в классе GameWindow, где класс ResolutionSetting определяется как частный класс в GameWindow. Я видел этот пост, который подробно описывается, как инициализировать статические член константных классов, однако это не относится случай, когда определение типа упомянутого элемент недоступно из сферы внешнего класса (например, когда тип указан с правилами частного доступа ). И как я могу идти об инициализации этих объектов? Будет: Const GameWindow :: ResolutionSetting GameWindow :: w640h480 (640, 480); или Const GameWindow :: ResolutionSetting GameWindow :: w640h480 = GameWindow :: ResolutionSetting (640, 480); хватает? (При условии, что я могу исправить любые возможные проблемы с ResolutionSetting быть недоступны). т включают случай, когда определение типа указанного элемента недоступен из сферы внешнего класса (например, когда тип указан с правилами частного доступа). И как я могу идти об инициализации этих объектов? Будет: Const GameWindow :: ResolutionSetting GameWindow :: w640h480 (640, 480); или Const GameWindow :: ResolutionSetting GameWindow :: w640h480 = GameWindow :: ResolutionSetting (640, 480); хватает? (При условии, что я могу исправить любые возможные проблемы с ResolutionSetting быть недоступны). т включают случай, когда определение типа указанного элемента недоступен из сферы внешнего класса (например, когда тип указан с правилами частного доступа). И как я могу идти об инициализации этих объектов? Будет: Const GameWindow :: ResolutionSetting GameWindow :: w640h480 (640, 480); или Const GameWindow :: ResolutionSetting GameWindow :: w640h480 = GameWindow :: ResolutionSetting (640, 480); хватает? (При условии, что я могу исправить любые возможные проблемы с ResolutionSetting быть недоступны). хватает? (При условии, что я могу исправить любые возможные проблемы с ResolutionSetting быть недоступны). хватает? (При условии, что я могу исправить любые возможные проблемы с ResolutionSetting быть недоступны).
Sean Pianka
7

голосов
0

ответ
33

Просмотры

Имеет ли в классе друг вложенного класса доступ к членам внешнего класса?

лязг ++, г ++ и MSVC не согласны с этим кодом: класс А {частное: перечисление класса Е {NO, YES}; класс B {частный: друг E f1 () {вернуться E :: YES; } // другу Е 2 (); }; }; // A :: Е 2 () {вернуться A :: E :: ДА; } INT основных () {} лязг ++ принимает код, как показано на рисунке. г ++ и MSVC жалуются на f1, что A :: E недоступен. Если функция f2 является раскомментирована, все три компиляторов жалуются на его определение, что A :: E недоступен. Является ли f1 на самом деле действует? Соответствующие стандартные детали, которые я нашел, являются: [class.access.nest]: Вложенный класс является членом и, таким образом, имеет те же права доступа, как и любой другой член. Хотя это само по себе не означает друзей вложенного класса имеют все те же права, вложенного класса. [Class.access.base] / 5: Доступ к элементу зависит от класса, в котором элемент с именем. Этот класс именование класс, в котором имя члена смотрели и нашли. Член м доступен в точке R, когда названный в классе N, если т как член N является публичным, или м как член N является частным, и R происходит в элементе или другой класс N, или м в виде член N защищен, и ..., или существует базовый класс B из N, который доступен на R, и м доступен в R, когда названный в классе В. Таким образом, f2 является недействительным, так как класс имен для A :: E, безусловно, нет базовых классов, участвующих и определение f2 не является член или друг а и не «происходит в» члене или друг А. в f1 классе имен для неквалифицированного E является также А. ([basic.lookup.unqual] говорит поиск по имени Е в классе A :: B выполняется первый, но это не «нашел» там, так что затем поиск в классе а делается, и член найден.) Но я думаю, большой вопрос, то есть, это определение f1 «происходит в» члене? Этот член, если да, то должны быть класса A :: B.
aschepler
1

голосов
1

ответ
103

Просмотры

СУЩЕСТВУЕТ в ANSI SQL. Имя таблицы в супер запросе

Это классический EXISTS запрос: SELECT S.SupplierName AS Поставщик от поставщиков S, где существует (SELECT P.ProductName из продуктов Р ГДЕ P.SupplierId = S.supplierId И p.price <20); Тем не менее, я сказал, что, хотя этот запрос будет работать почти во всех СУБД, не допускается в ANSI SQL, потому что я назвал таблицу в подзапрос, который явно не назван в главном запросе. Нечто подобное должно быть правильным: SELECT S.SupplierName AS Поставщик от поставщиков S, P Продукты --Yes, Join находится на рассмотрении здесь WHERE EXISTS (SELECT P2.ProductName FROM Products WHERE P2 = P2.SupplierId S.supplierId И P2.Price < 20); Но это не имеет смысла для меня тоже, но я искал официальный пример ANSI SQL, чтобы доказать, что не надо называть таблицы подзапроса в главном запросе, и я ничего не нашел. Я был бы очень признателен, если кто-то может сказать мне, если первый запрос ANSI SQL.
Osvaldo Fernandez
1

голосов
1

ответ
58

Просмотры

Не то, что отсутствует в [expr.cond] / 2?

[Expr.cond] / 2: 2 Если какой-либо второй или третий операнд имеет тип недействительным, одно из следующих действий проводит: (2.1) - второй или третий операнд (но не оба) является (возможно, в скобках) бросок -expression (8,17); результат имеет тип и значение категории другого. Условно-выражение представляет собой битовое поле, если этот операнд битового поле. (2.2) - И второй и третий операнды имеют тип пустоты; результат имеет тип пустоты и является prvalue. [Примечание: Это включает в себя случай, когда оба операнда вбрасывание выражения. -end примечание] Рассмотрим случай, когда второй операнд имеет тип тщетным, но это не вбрасывание выражения, а третий операнд является вбрасывание выражение. Будет ли этот случай подпадает под (2.1) или (2.2)?
João Afonso
2

голосов
1

ответ
23

Просмотры

Как выделить массив структур с гибкими элементами массива comformingly?

У меня следующая структура с гибким элементом массива: тестом STRUCT {size_t SZ; Const символ ул []; }; Теперь я хочу, чтобы выделить некоторую память, чтобы поместить это непрерывно STRUCT (например, в массиве). Проблема заключается в декларации, как тест структуры test_arr [] не определен поведение. 6.7.2.1 (р3): последний член структуры с более чем одним именем элемента может иметь неполный тип массива; такая структура (и любой союз, содержащий, возможно, рекурсивно, член, что такая структура) не должна быть членом структуры или элемент массива. Мы знаем, что указатель, возвращаемый таНос может быть преобразован в указатель на любой тип objecut с фундаментальным выравниванием. Рассмотрим следующий код: * OBJ пустот = таНос (100 * SizeOf (тест-структура)); // достаточно памяти структура теста * t1 = OBJ; t1 -> SZ = 2; t1 - ул = { 'а', 'Ь'}>; структура тест * t2 = (* аннулируется) (((символ *) OBJ) + SizeOf (тест структуры) + SizeOf (Char [2])); // не соответствующее Что такое соответствующий способ сделать это?
Some Name
1

голосов
2

ответ
124

Просмотры

Являются ли совместимые параметры массива Власа?

Secure Coding Standard CERT включает в себя элемент (API05-C), которая поощряет использование согласующихся параметров массива, который является рекомендацией я реализовал в большом количестве моего кода (скрытый за макрос для компиляторов, которые не поддерживают их). Для тех, кто не знает, совместимый параметр массива является что-то вроде: ничтожных обув (длину INT, символ данных [длину]); API05-С содержит более подробную информацию. Многие компиляторы не любят массивы переменной длины (по уважительной причине). C11 понижает их от необходимости (так как они были в C99) для необязательных (компиляторов должны определить __STDC_NO_VLA__, если они не реализованы). MSVC утончаются не поддерживает их. IAR прячет их за выключателем (--vla). GCC и лязг предупредит вас о них, если вы спросите (с -Wvla или -Werror = вла если вы хотите об ошибке). Совместимая массив параметров Дона» т страдают от тех же проблем, как «нормальные» массивы переменной длины; они не приводят к использованию переменного стека. Они просто сказать компилятору, как большой существующий массив, который может быть в стеке или куче, есть. Моя проблема заключается в том, что каждый компилятор я знаю лечит совместимые параметры массива, как Влас. Это не такая большая проблема для компиляторов, как MSVC, так как я могу просто определить мой макрос ничего, но для компиляторов как GCC и лязг Я хочу использовать совместимые параметры массива, но не хочу, чтобы вызвать -Wvla диагностики. В соответствии с API05-C (курсив): Следовательно, декларация массив, который служит в качестве аргумента функции может иметь индекс, который является переменной или выражением. Аргумент массива понижен до указателя и, следовательно, не является переменным массивом длины (VLA). Совместимые параметры массива могут быть использованы разработчиками, чтобы указать ожидаемые границы массива. Эта информация может быть использована составителями, или это может быть проигнорировано. Однако такие заявления являются полезными для разработчиков, поскольку они служат для документирования отношений между размерами массивов и указателями. Эта информация также может быть использована инструментами статического анализа для диагностики потенциальных дефектов. Я отчаянно хочу, чтобы это было правдой, но я не могу показаться, чтобы найти соответствующие части стандартов C99 или C11. Так, на основе строго по стандартам C99 / C11, являются параметрами массива совместимых Власа? Или, выражаясь иначе, это передача массива в качестве аргумента действительно разжаловать его в указатель? Очевидно, просьба указать соответствующие части спецификации (ов). Однако такие заявления являются полезными для разработчиков, поскольку они служат для документирования отношений между размерами массивов и указателями. Эта информация также может быть использована инструментами статического анализа для диагностики потенциальных дефектов. Я отчаянно хочу, чтобы это было правдой, но я не могу показаться, чтобы найти соответствующие части стандартов C99 или C11. Так, на основе строго по стандартам C99 / C11, являются параметрами массива совместимых Власа? Или, выражаясь иначе, это передача массива в качестве аргумента действительно разжаловать его в указатель? Очевидно, просьба указать соответствующие части спецификации (ов). Однако такие заявления являются полезными для разработчиков, поскольку они служат для документирования отношений между размерами массивов и указателями. Эта информация также может быть использована инструментами статического анализа для диагностики потенциальных дефектов. Я отчаянно хочу, чтобы это было правдой, но я не могу показаться, чтобы найти соответствующие части стандартов C99 или C11. Так, на основе строго по стандартам C99 / C11, являются параметрами массива совместимых Власа? Или, выражаясь иначе, это передача массива в качестве аргумента действительно разжаловать его в указатель? Очевидно, просьба указать соответствующие части спецификации (ов). т показаться, чтобы найти соответствующие части стандартов C99 или C11. Так, на основе строго по стандартам C99 / C11, являются параметрами массива совместимых Власа? Или, выражаясь иначе, это передача массива в качестве аргумента действительно разжаловать его в указатель? Очевидно, просьба указать соответствующие части спецификации (ов). т показаться, чтобы найти соответствующие части стандартов C99 или C11. Так, на основе строго по стандартам C99 / C11, являются параметрами массива совместимых Власа? Или, выражаясь иначе, это передача массива в качестве аргумента действительно разжаловать его в указатель? Очевидно, просьба указать соответствующие части спецификации (ов).
nemequ
1

голосов
1

ответ
87

Просмотры

Безопасно ли использовать зЬй :: вектор в качестве хранилища для гетерогенных записей?

У меня есть необходимость работать с записями из серии POD элементов. Типы этих элементов найдены во время выполнения, прежде чем серия этих записей обрабатываются. В идеале для хранения записей будет удерживать элементы смежно таким образом, хранение может быть непосредственно заселена или выход с системой ввода-вывода вызовов. Учитывая следующий упрощенный пример кода: шаблон структуру ElementAccessor {ElementAccessor (INT смещения): _offset (смещение) {} T & оператор () (* недействительные данные) {возвращение reinterpret_cast (* reinterpret_cast (данные) + _offset); } INT _offset; }; ElementAccessor Fel (0); ElementAccessor ИЭЛ (SizeOf (поплавок)); Ищу действительный и удобный способ хранения записей? Я рассмотрел следующие методы: вектор Использование вектор кажется удобным: станд :: вектор intData (2); ИЭЛ (intData. данные ()) = 42; Fel (intData.data ()) = 12.4f; // <Ого, неопределенное поведение, может быть нулевая инициализация может быть заказана после этого момента! но будет нарушать правила строгого сглаживания. Сырой выделенная память, я считаю, что ниже правильный код, но это неудобно, так как управление памятью руководства: аннулируется * voidData (оператор нового (2 * SizeOf (INT))); ИЭЛ (voidData) = 42; Fel (voidData) = 12.4f; ... оператор удаления (voidData); станд :: вектор Как об использовании зОго :: вектора: станд :: вектора charData (2 * SizeOf (INT)); ИЭЛ (charData.data ()) = 42; Fel (charData.data ()) = 12.4f; Это удобно в том, что станд :: вектор красиво обрабатывает управление памятью. Но это действует? Сырой выделенная память, я считаю, что ниже правильный код, но это неудобно, так как управление памятью руководства: аннулируется * voidData (оператор нового (2 * SizeOf (INT))); ИЭЛ (voidData) = 42; Fel (voidData) = 12.4f; ... оператор удаления (voidData); станд :: вектор Как об использовании зОго :: вектора: станд :: вектора charData (2 * SizeOf (INT)); ИЭЛ (charData.data ()) = 42; Fel (charData.data ()) = 12.4f; Это удобно в том, что станд :: вектор красиво обрабатывает управление памятью. Но это действует? Сырой выделенная память, я считаю, что ниже правильный код, но это неудобно, так как управление памятью руководства: аннулируется * voidData (оператор нового (2 * SizeOf (INT))); ИЭЛ (voidData) = 42; Fel (voidData) = 12.4f; ... оператор удаления (voidData); станд :: вектор Как об использовании зОго :: вектора: станд :: вектора charData (2 * SizeOf (INT)); ИЭЛ (charData.data ()) = 42; Fel (charData.data ()) = 12.4f; Это удобно в том, что станд :: вектор красиво обрабатывает управление памятью. Но это действует? вектор красиво обрабатывает управление памятью. Но это действует? вектор красиво обрабатывает управление памятью. Но это действует?
PeterSW
1

голосов
1

ответ
43

Просмотры

Могу ли я читать из параметра в то же время, перемещая его в другой параметр, если требуется преобразование?

Скажем, у меня есть код: структура A {INT ВАЛ, имя строка}; А а {5, "Привет"}; п (a.val, станд :: ход (а)); Теперь, похоже, я читаю из а и также переходят из на одной и той же линии, которая выглядит плохо, как упорядоченность параметр, как правило, не определен. Однако, как станд :: двигаться просто слепок, что должно быть в порядке - так что я на самом деле не чтение из перемещенных от стоимости. Что же происходит, если сноска на самом деле принимает второй параметр по значению: п (интермедиат первой, второй); В этом случае новый А должен быть построен из перемещенных от значения а. это началось бы вызывает проблемы в моем первом примере? Я предполагаю, что конструктор параметра второго может быть вызван перед первым a.val параметра считывается?
Mike Vine
1

голосов
1

ответ
0

Просмотры

лязг и НКУ интерпретировать серию литых по-разному

Следующий: #include INT & аддон (интермедиат & г) {возвращение ++ г; } INT основных () {станд :: соиЬ
sp2danny
1

голосов
2

ответ
782

Просмотры

Понимание частичной специализации наследуемых шаблонов вложенных классов

Этот вопрос связан с предыдущим Q & A, в котором был упомянут в докладе ошибки для GCC (предположительно исправлены в GCC 4.5.0) и касается некоторых особенностей частичной специализации шаблона вложенного класса. Моя установка является то, что у меня есть базовый класс с шаблоном вложенного класса Inner, который частично специализировался на голец (с использованием фиктивного параметра трюка, так как явное speciliaztion не допускаются в классе). #include #include #include структура Base {// фиктивного шаблон параметр ... шаблон структура Внутренне: станд :: true_type {}; // ... чтобы в классе частичной специализации шаблона структура Внутренне: станд :: false_type {}; }; Теперь я определить производный класс, для которого я также хочу специализироваться Внутренне, который по какой-то причине не может быть сделано в классе (даже если он по-прежнему частичная специализация). STRUCT Derived: Base {// не может частично специализировать Внутренне внутри Derived ... // шаблон // структура Внутренне: станд :: false_type {}; }; // ... но специализирующийся Derived :: Внутренне в области видимости пространства имен, а также специализируется на его базе :: Внутренний шаблон структура Derived :: Внутренне: зЬй :: false_type {}; Первый вопрос: почему я должен частично специализируется Derived :: Inner в области видимости пространства имен? Но самое странное в том, что, когда я называю различные частичные специализации Inner как из базы и производный, частичная специализация для междунар, что я сделал только для Derived, также относится и к базе. ИНТ основной () {станд :: соиЬ Первый вопрос: почему я должен частично специализируется Derived :: Inner в области видимости пространства имен? Но самое странное в том, что, когда я называю различные частичные специализации Inner как из базы и производный, частичная специализация для междунар, что я сделал только для Derived, также относится и к базе. ИНТ основной () {станд :: соиЬ Первый вопрос: почему я должен частично специализируется Derived :: Inner в области видимости пространства имен? Но самое странное в том, что, когда я называю различные частичные специализации Inner как из базы и производный, частичная специализация для междунар, что я сделал только для Derived, также относится и к базе. ИНТ основной () {станд :: соиЬ
TemplateRex
1

голосов
3

ответ
433

Просмотры

Как сделать НКУ рад встраиваемых систем и ничтожной основной (пустоте)

C11 5.1.2.2.1 говорит, что [главный ()] должна быть определена с типом возвращаемого междунар Однако, раздел 6.7.4 вводит ключевое слово _Noreturn, который, кажется, очень полезно для основной () из голой кости встраиваемых систем , Самый элегантный способ объявить невозвратные основные ()? Является ли это _Noreturn Int основной (вакуум)?
Vorac
1

голосов
2

ответ
166

Просмотры

Туда и обратно выравнивание литья указателя

Если у меня есть указатель (без знака длиной * uptr) на массив (без знака длины) - или любого типа с (как правило) более жесткими требованиями, чем выравниванием (символ) - и литые: символ * bptr = (символ *) uptr; / * Всегда работает. * / Ли литье (bptr) к (без знака длинных *) получают оригинальный указатель? Я понимаю, что приведение к указателю с более жесткими требованиями выравнивания не может дать указатель, который может быть безопасно derefenced в целом. Но действительно ли стандарт гарантировать туда-обратно значение указателя в этом случае? Я не могу представить себе реализацию (символ *), где это не будет работать, как и следовало ожидать, учитывая, что он должен иметь, по крайней мере, столько, сколько битов в его представлении для решения байтов. Другие ответы делают общий случай ясно. Он просто никогда не приходило мне на вопрос, было ли это гарантировано.
Brett Hale
1

голосов
1

ответ
71

Просмотры

Правила подстановки Имя пользователя

Сек. 10.2 описывает имя члена правила подстановки: 10.2 / 3: поиск устанавливается для F в C, называется S (F, С), состоит из двух наборов компонентов: набор декларации, набор элементов с именем F; и множество подобъектом, множество подобъектов, где были обнаружены заявления этих членов (возможно, в том числе с использованием деклараций). В наборе декларации, с помощью деклараций заменяются членами, они обозначают, и заявления типа (в том числе нагнетаемого класса названий) заменяются типами они обозначают. S (F, С) рассчитываются следующим образом: 10.2 / 4: Если С содержит объявление имени F, множество декларации содержит все декларации е объявленные в C, которая удовлетворяет требования языка построение, в котором происходит поиск. Рассмотрим следующие два примера: класс А {аннулируются Foo () {A :: A; } // S (A, A) = {статического сопзЬ Int А; } Статической сопзЬ Int А = 5; } И класс А {INT B [A :: а]; // S (а, А) пусто, и программа плохо сформированный статический сопз Int А = 5; } Что такое фактические S (F, C) правила расчета и почему?
1

голосов
3

ответ
138

Просмотры

Undefined behavior when the offending expression is not used?

В комментарии по @MarcvanLeeuwen к другому Q & A, было высказано предположение о том, что следующее неопределенное поведение (UB): шаблон FwdIt find_before (FwdIt before_first, FwdIt наконец, T Const и значение) {вернуться зЬй :: adjacent_find (before_first, наконец, [& ] (авто Const & / * L * /, авто Const & R) {// обратите внимание, что левый аргумент лямбда не вычисляется возвращаемое значение R ==;}); } Автоматический список = станд :: forward_list {1, 2}; авто он = find_before (list.before_begin (), list.end (), 1); // неопределенное поведение !? УБ исходит из того, что BinaryPredicate, который подается к Std :: adjacent_find будет разыменовать двух смежных итераторы в то время, первая пара является list.before_begin () и list.begin (). Поскольку before_begin () не разыменовываемое, это может повлечь за собой UB. С другой стороны, левый аргумент никогда не используется внутри лямбда. Можно было бы утверждать, что под «как если бы» править он ненаблюдает ли на самом деле состоялся derefence, так что оптимизирующий компилятор может игнорировать его полностью. Вопрос: что стандарт говорит о разыменования итератора в undereferencable его, когда выражение * оно фактически не используется и может быть оптимизирован прочь? (Или в более общем случае, это UB, когда выражение-нарушитель не используется?) Примечание: код нарушитель легко исправить с помощью специального кожуха первого итератора (как это делается в обновленном оригинальном Q & A). что делает стандарт говорят о разыменования итератора в undereferencable его, когда выражение * оно фактически не используется и может быть оптимизирован прочь? (Или в более общем случае, это UB, когда выражение-нарушитель не используется?) Примечание: код нарушитель легко исправить с помощью специального кожуха первого итератора (как это делается в обновленном оригинальном Q & A). что делает стандарт говорят о разыменования итератора в undereferencable его, когда выражение * оно фактически не используется и может быть оптимизирован прочь? (Или в более общем случае, это UB, когда выражение-нарушитель не используется?) Примечание: код нарушитель легко исправить с помощью специального кожуха первого итератора (как это делается в обновленном оригинальном Q & A).
TemplateRex
1

голосов
2

ответ
343

Просмотры

Теория - Java - абстрактный тип данных и тип справочных данных

Есть понятия «абстрактного типа данных» и «типа данных ссылочных» относятся к одной и тем же вещам, и, таким образом, используются в противопоставлении «примитивного типа данных»? Спасибо!
aRCo
1

голосов
1

ответ
47

Просмотры

Определение юридического действия потока

Я пытался понять модель памяти Java и один-х многопоточности Sematic. Соответствующие JLS 17,4 из JLS 8 раздела говорит: Для того, чтобы определить, являются ли действия потока т в казни являются законными, мы просто оценить реализацию нити т, как это будет выполняться в однопоточных контексте, как это определено в остальной части этого Спецификация. Что означает фраза, которую я имею в виду подчеркнуть, в этом контексте? Я имею в виду, я не могу себе представить законные и незаконные действия нити в исполнении. Не могли бы вы привести пример, если таковые имеются, из них?
1

голосов
1

ответ
94

Просмотры

Link failure when typedef declaration defines unnamed class

Раздел 7.1.3 [9] из C ++ 11 стандартных состояний: Если декларация ЬурейеЙ определяет безымянный класс (или перечисление), первый ЬурейеЕ имя объявлено в декларации, чтобы быть, что тип класса (или перечисление) используется для обозначения типа класса (или перечисление) только для сцепления (3.5). [Пример: ЬурейиЕ структуры {} * пс, S; // S это имя класса для целей сцепления -end пример] Это означает, что в приведенном ниже примере, Foo следует использовать в качестве имени безымянного класса и используются для целей сцепления в приведенном ниже примере: //foo1.cpp ЬурейеЕ класса {общественности: ИНТ е (); } Foo; INT Foo :: F () {возвращение 5; } Так как Foo :: е) определяется (в foo1.cpp, компилятор не должен жаловаться. //foo2.cpp ЬурейеЕ класс {общественности: ИНТ е (); } Foo; Foo Foo; INT основных () {возвращение foo.f (); } Тем не менее, я получаю ошибку ссылку с GCC 4.8. Я что-то пропустил? $ Г ++ foo1.cpp foo2.cpp /tmp/ccMwHawT.o: В функции 'главный ':. 713Y51.cpp :( текст + 0x24): неопределенная ссылка на `Foo :: F ()' collect2: ошибка: л.д. 1 возвращается статус выхода
Harvinder

Просмотр дополнительных вопросов