language-lawyer- все статьи тега


Позволяет ли связывание C С C++ избежать неопределенного поведения, которое является законным в C, но не C++?

Если у вас есть файл C, скомпилированный с помощью компилятора C и имеющий определенное поведение для C, но не C++, можно ли связать его с файлом C++ и не иметь неопределенного поведения? В бла.c (файл, скомпилированный как C) struct x { int blah; char buf[]; }; extern char * get_buf(struct x * base); extern struct x * make_struct(int blah, int size); Blah_if.h extern "C" { struct x; char * get_buf(struct x * base); struct x * make_struct(int blah, int size); } Some ...

Будет ли инициализатор строки несколько тратить память?

Чтобы инициализировать массив символов, обычно я пишу: char string[] = "some text"; Но сегодня один из моих одноклассников сказал, что нужно использовать: char string[] = {'s', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't', ''}; Я сказал ему, что это безумие-отказаться от удобочитаемости и краткости, но он утверждал, что инициализация массива символов строкой фактически создаст две строки, одну в стеке, а другую в памяти только для чтения. При работе со встроенными устройствами это может прив ...

Что такое использование ref-квалификатора ' const &&'?

Я немного покопался в ref-квалификаторах, следуя за предыдущим вопросом. Приведен пример кода ниже; #include <iostream> #include <string> #include <utility> struct A { std::string abc = "abc"; std::string& get() & { std::cout << "get() &" << std::endl; return abc; } std::string get() && { std::cout << "get() &&" << std::endl; return std::move(abc); } std::string const& get() const & { ...

Является ли main допустимым идентификатором Java?

один из моих детей принимает Java в средней школе и имел это на одном из своих тестов: какой из следующих идентификаторов является допустимым в Java? a.123java б. main c.java1234 d.{abce e.)whoot он ответил b и ошибся. Я посмотрел на вопрос и утверждал, что mainи действующий и что это должно было быть правильно. мы взглянули на Java spec для идентификаторов и это укрепило этот пункт. Мы также написали пример программы, которая имела переменную с именем ...

Копирование / перемещение назначения в std:: vector:: erase() и std:: deque:: erase()

в ответе еще вопрос я наткнулся на несколько другие формулировки для std::vector::erase() и std::deque::erase(). вот что говорит C++14 о std::deque::erase ([deque.modifiers]/4-6, выделено мной): эффекты: ... сложность: количество вызовов деструктора совпадает с количеством стертых элементов, но Количество звонков в назначение оператор не больше, чем меньшее из числа элементов До стертых элементов и количество элементов после стертых элементов. Броски: ничего, если исключение ...

Определение оператора "= = " для Double

по какой-то причине я пробирался в источник .NET Framework для класса Double и выяснил, что декларация == - это: public static bool operator ==(Double left, Double right) { return left == right; } та же логика применима к оператора. в чем смысл такого определения? как это работает? почему он не создает бесконечную рекурсию? ...

Почему "использование пространства имен X;"не допускается на уровне класса/структуры?

class C { using namespace std; // error }; namespace N { using namespace std; // ok } int main () { using namespace std; // ok } редактировать: хочу знать мотивацию за ним. ...

Изменены правила для защищенных конструкторов в C++17?

у меня есть этот тест: struct A{ protected: A(){} }; struct B: A{}; struct C: A{ C(){} }; struct D: A{ D() = default; }; int main(){ (void)B{}; (void)C{}; (void)D{}; } и gcc и clang компилируют его в режиме C++11 и C++14. Оба сбоя в режиме C++17: $ clang++ -std=c++17 main.cpp main.cpp:7:10: error: base class 'A' has protected default constructor (void)B{}; ^ main.cpp:1:22: note: declared protected here struct A{ protected: A(){} }; ^ ...

Изменился ли стандарт C++ в отношении использования неопределенных значений и неопределенного поведения в C++14?

как описано в разделе инициализация влечет за собой преобразование lvalue-to-rvalue? Это int x = x; UB? в стандарте C++ есть удивительный пример в разделе 3.3.2пункт декларации, в котором int инициализируется собственным неопределенным значением: int x = 12; { int x = x; } здесь второй x инициализируется своим собственным (неопределенным) значением. - пример] какой ответ Йоханнеса на этот вопрос указывает на это неопределенное поведение, так как он требует это значение lvalue-на-прав ...

Используя броска;` на основе модифицированной исключение

у меня есть функция foo что может бросить bar исключения. в другой функции я называю foo но у меня есть возможность добавить еще несколько деталей к bar исключение, если бросили. (Я бы предпочел не передавать такую информацию в качестве параметра foo поскольку он действительно не принадлежит там из-за общей природы этой функции.) поэтому я делаю это в вызывающем абоненте: try { foo(); } catch (bar& ex){ ex.addSomeMoreInformation(...); throw; } будет throw повторно бросить из ...

В C++ оператор switch выражение гарантии оценки

относительно переключателя стандартные состояния следующие. " когда оператор switch выполняется, его состояние оценивается и сравнивается с каждой константой case." означает ли это, что выражение условия вычисляется один раз и только один раз, и оно гарантируется стандартом для каждого компилятора? например, когда функция используется в головке оператора switch, с побочным эффектом. int f() { ... } switch (f()) { case ...; case ...; } ...

Имеют ли отдельные функции разные адреса?

рассмотрим эти две функции: void foo() {} void bar() {} гарантируется ли, что &foo != &bar? аналогично, template<class T> void foo() { } гарантируется ли, что &foo<int> != &foo<double>? есть два компоновщика, которые я знаю о том, что определения функции сгиба вместе. MSVC агрессивно COMDAT складывает функции, поэтому две функции с одинаковой реализацией могут быть превращены в одну функцию. В качестве побочного эффекта обе функции имеют один и тот же ...

Что такое тип нулевого литерала?

Dухо все, интересно, что это за тип null литерала в C#? в Java null литерал особый тип null: существует также специальный тип null, тип выражения null, который не имеет имени. Поскольку тип null не имеет имени, невозможно объявить переменную типа null или привести к типу null. Нулевая ссылка является единственной возможное значение выражения нулевого типа. Нулевая ссылка всегда может быть приведена к любому типу ссылки. в C++11, есть nullptr (рекомендуемая версия старого приятеля NULL), ...

Как называется эта необычная функция шаблона C++, используемая Boost.Дух?

приведенный ниже код от импульс.Документация Spirit x3. Он использует интересный синтаксис C++, который я никогда раньше не видела, который почти невозможно описать в поисковом запросе, не зная правильной терминологии. Является ли это сокращением для прямого объявления класса? Где эта функция упоминается в стандарте C++? namespace parser { using x3::eps; using x3::lit; using x3::_val; using x3::_attr; using ascii::char_; auto set_zero = [&](auto& ctx){ _val(ctx) ...