Вопросы с тегом «language-lawyer»

Для вопросов о тонкостях формальных или авторитетных спецификаций языков программирования и сред.

2
Является ли программа, которая никогда не завершает действительную программу C ++?
Требуется ли прекращение работы программы? Другими словами, это программа, которая всегда работает технически с неопределенным поведением? Обратите внимание, что это не о пустых циклах. Разговор о программах, которые делают "вещи" (то есть наблюдаемое поведение) навсегда. Например, что-то вроде этого: int main() { while (true) { try { get_input(); // calls …

1
Почему оптимизация пустой базы запрещена, если пустой базовый класс также является переменной-членом?
Оптимизация пустой базы - это здорово. Тем не менее, он имеет следующие ограничения: Оптимизация пустой базы запрещена, если один из пустых базовых классов также является типом или базой типа первого не статического члена данных, поскольку два базовых подобъекта одного типа должны иметь разные адреса в представлении объекта. самого производного типа. …

1
Является ли разница между двумя экземплярами constexpr указателей __func__ все еще constexpr?
Это действительный C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC и MSVC считают, что все в порядке, Clang считает, что это не так: Compiler Explorer . Все компиляторы соглашаются, что с этим все в порядке: Compiler Explorer . int main() { constexpr …

1
Это ошибка в std :: gcd?
Я сталкивался с таким поведением, std::gcdкоторое я нашел неожиданным: #include <iostream> #include <numeric> int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type<decltype(a), decltype(b)>::type; C ca = std::abs(a); C cb = b; std::cout << a << …

2
Почему мы не можем создавать тривиально конструируемые объекты, используя malloc, если тривиальный конструктор по умолчанию не выполняет никаких действий?
Мне трудно понять следующий абзац, цитируемый из cppreference о тривиальном конструкторе по умолчанию. Я искал stackoverflow, но все еще не получил четкого ответа. Поэтому, пожалуйста, помогите. Тривиальный конструктор по умолчанию - это конструктор, который не выполняет никаких действий. Все типы данных, совместимые с языком C (типы POD), легко конструируются по …

4
Как достичь барьера StoreLoad в C ++ 11?
Я хочу написать переносимый код (Intel, ARM, PowerPC ...), который решает вариант классической задачи: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something } в которой цель состоит в том, чтобы избежать ситуации, в которой работают оба потокаsomething . (Хорошо, если ни одна из …

4
Является ли объяснение расслабленного порядка ошибочным в сравнении?
В документации std::memory_orderна cppreference.com есть пример непринужденного заказа: Расслабленный заказ Маркированные атомарные операции memory_order_relaxedне являются операциями синхронизации; они не навязывают порядок между одновременными обращениями к памяти. Они гарантируют только атомарность и согласованность порядка модификации. Например, с х и у изначально ноль, // Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, …

2
если constexpr с static_assert в лямбде, какой компилятор правильный?
Когда мы хотим использовать a static_assertв a, if constexprмы должны сделать условие зависимым от некоторого параметра шаблона. Интересно, что gcc и clang не согласны, когда код обернут в лямбду. Следующий код компилируется с помощью gcc, но clang запускает утверждение, даже если значение if constexprне может быть истинным. #include <utility> template<typename …


1
Что предотвращает перекрытие смежных членов в классах?
Рассмотрим следующие три structс: class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; На типовых платформах, где int4 байта, размеры, выравнивания и общее заполнение 1 следующие: struct size alignment padding -------- …

1
Какие правила существуют для функции a -> (), вычисляемой в Haskell?
Как и в заголовке: какие гарантии существуют для функции, возвращающей единицу функции Haskell, которая будет оценена? Можно было бы подумать, что в таком случае нет необходимости выполнять какую-либо оценку, компилятор может заменить все такие вызовы непосредственным ()значением, если нет явных запросов на строгость, и в этом случае код может решить, …

1
Могут ли быть разные неявные объекты, основанные на более позднем решении времени выполнения в C ++ 20?
Этот вопрос относится к добавлению P0593 к последней версии C ++ 20 . Вот мой пример: #include <cstdlib> #include <cstdio> void foo(void *p) { if ( std::getchar() == 'i' ) { *(int *)p = 2; std::printf("%d\n", *(int *)p); } else { *(float *)p = 2; std::printf("%f\n", *(float *)p); } } …

4
Прерывание изменений в C ++ 20 или регрессия в clang-trunk / gcc-trunk при перегрузке сравнения равенства с небулевым возвращаемым значением?
Следующий код прекрасно компилируется с clang-trunk в режиме c ++ 17, но прерывается в режиме c ++ 2a (предстоящий c ++ 20): // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() …

1
GCC реализация угловых скобок включает в себя. Почему это должно быть так, как описано ниже?
Этот документ в разделе 2.6 «Вычисленные включения» имеет следующий параграф: Если строка расширяется до потока токенов, начинающегося с токена <и включающего токен>, то токены между <и первым> объединяются, чтобы сформировать имя файла для включения. Любой пробел между токенами сводится к одному пробелу; тогда любой пробел после начального <сохраняется, но завершающий …
11 c++  c  gcc  language-lawyer 

1
Почему компилятор выбирает этот универсальный метод с параметром типа класса при вызове с несвязанным типом интерфейса?
Рассмотрим следующие два класса и интерфейс: public class Class1 {} public class Class2 {} public interface Interface1 {} Почему второй вызов mandatoryвызывает перегруженный метод с Class2, если getInterface1и Interface1не имеет отношения с Class2? public class Test { public static void main(String[] args) { Class1 class1 = getClass1(); Interface1 interface1 = …

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.