Запитання з тегом «language-lawyer»

Питання щодо тонкощів формальних чи авторитетних специфікацій мов програмування та середовищ.

1
Чи є різниця двох екземплярів constexpr __func__ покажчиків досі constexpr?
Чи дійсно це C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC та MSVC вважають, що це нормально, Кланг вважає, що це не так: Compiler Explorer . Усі компілятори погоджуються, що це нормально: Провідник компілятора . int main() { constexpr auto p = …

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 about тривіального конструктора за замовчуванням. Я шукав stackoverflow, але все одно не отримав чіткої відповіді. Тож, будь ласка, допоможіть. Тривіальний конструктор за замовчуванням - це конструктор, який не виконує жодної дії. Усі типи даних, сумісні з мовою С (типи …

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
Чи пояснення розслабленого замовлення помилкове в cppreference?
У документації std::memory_orderна сайті cppreference.com є приклад розслабленого замовлення: Розслаблене замовлення Атомні операції з тегом memory_order_relaxedне є операціями синхронізації; вони не нав'язують порядок серед паралельних доступу до пам'яті. Вони гарантують лише атомність та послідовність порядку модифікації. Наприклад, спочатку x і y дорівнює нулю, // Thread 1: r1 = y.load(std::memory_order_relaxed); // …

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


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

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

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); } } int …

4
Порушення зміни C ++ 20 або регресія в clang-trunk / gcc-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 Computed Includes має такий параграф: Якщо рядок розширюється до потоку токенів, що починається з <лексеми і включає> маркер, то лексеми між <і першим> об'єднуються, щоб утворювати ім'я файлу, яке потрібно включити. Будь-який пробіл між маркерами зводиться до одного простору; то будь-який простір після початкового <зберігається, …
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 = …

2
Чи повинен бути T повного типу, щоб використовувати його в `std :: declval <T>`?
Розглянемо цей приклад ( звідси ): #include &lt;type_traits&gt; #include &lt;iostream&gt; template &lt;typename U&gt; struct A { }; struct B { template &lt;typename F = int&gt; A&lt;F&gt; f() { return A&lt;F&gt;{}; } using default_return_type = decltype(std::declval&lt;B&gt;().f()); }; int main() { B::default_return_type x{}; std::cout &lt;&lt; std::is_same&lt; B::default_return_type, A&lt;int&gt;&gt;::value; } Він компілюється без …

2
Вирахування типів аргументів шаблону C ++:
У мене є код, який знаходить і роздруковує відповідність візерунка як перехід над контейнером рядків. Друк виконується у шаблоні функції foo Код #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;iterator&gt; #include &lt;vector&gt; #include &lt;string&gt; #include &lt;tuple&gt; #include &lt;utility&gt; template&lt;typename Iterator, template&lt;typename&gt; class Container&gt; void foo(Iterator first, Container&lt;std::pair&lt;Iterator, Iterator&gt;&gt; const &amp;findings) { for …

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.