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

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

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) …

3
Несовместимое усечение беззнаковых целочисленных выражений битового поля между C ++ и C в разных компиляторах
Изменить 2 : Я отлаживал странный тестовый сбой, когда функция, ранее находившаяся в исходном файле C ++, но дословно перемещенная в файл C, начала возвращать неверные результаты. MVE ниже позволяет воспроизвести проблему с GCC. Однако, когда я по прихоти скомпилировал пример с Clang (а позже с VS), я получил другой …

1
Значение char, установленное в CHAR_MAX, гарантированно обернуто в CHAR_MIN?
Мой код: #include &lt;stdio.h&gt; #include &lt;limits.h&gt; int main() { char c = CHAR_MAX; c += 1; printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c); } Вывод: CHAR_MIN=-128 CHAR_MAX=127 c=-128 () Мы видим, что когда мы увеличиваем charпеременную, установленную в CHAR_MAX, она оборачивается в CHAR_MIN. Это поведение гарантировано? Или это будет …

1
Неожиданное исключение InvalidOperationException при попытке изменить отношение через значение свойства по умолчанию
В приведенном ниже примере кода я получаю следующее исключение при выполнении db.Entry(a).Collection(x =&gt; x.S).IsModified = true: System.InvalidOperationException: «Экземпляр типа сущности« B »не может быть отслежен, поскольку другой экземпляр со значением ключа« {Id: 0} »уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. …

2
Вывод аргумента шаблона для аргумента типа функции
Рассмотрим следующую программу. #include &lt;iostream&gt; template &lt;typename T&gt; void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout &lt;&lt; "g( " &lt;&lt; x &lt;&lt; " );\n"; } int main() { f( g ); } Программа успешно компилируется, и ее …

1
Почему добавление второго impl предотвращает принудительное приведение аргумента?
Я сталкивался с этой проблемой при попытке добавить impl Add&lt;char&gt; for Stringв стандартную библиотеку. Но мы можем повторить это легко, без махинаций оператора. Начнем с этого: trait MyAdd&lt;Rhs&gt; { fn add(self, rhs: Rhs) -&gt; Self; } impl MyAdd&lt;&amp;str&gt; for String { fn add(mut self, rhs: &amp;str) -&gt; Self { self.push_str(rhs); …

2
Создание стандартных исключений с аргументом нулевого указателя и невозможными постусловиями
Рассмотрим следующую программу: #include&lt;stdexcept&gt; #include&lt;iostream&gt; int main() { try { throw std::range_error(nullptr); } catch(const std::range_error&amp;) { std::cout &lt;&lt; "Caught!\n"; } } GCC и Clang с помощью libstdc ++ вызывают std::terminateи отменяют программу с сообщением terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid Clang с libc …

1
Это UB, чтобы возобновить сопрограмму функции-члена объекта, время жизни которого закончилось?
Этот вопрос вытекает из этого комментария: объяснение времени жизни лямбда для сопрограмм C ++ 20 относительно этого примера: auto foo() -&gt; folly::coro::Task&lt;int&gt; { auto task = []() -&gt; folly::coro::Task&lt;int&gt; { co_return 1; }(); return task; } Таким образом, вопрос заключается в том, fooприведет ли выполнение возвращаемой сопрограммы к UB. «Вызов» …

1
Неуказанное неявное создание объекта
Поскольку P0593 неявное создание объектов для низкоуровневой манипуляции с объектами было принято, объекты теперь можно создавать неявно в C ++ 20. В частности, формулировка, предложенная предложением, позволяет определенным операциям (таким как std::malloc) автоматически создавать и запускать время жизни объектов определенных типов, так называемые типы неявного времени жизни , если введение …

2
Почему C ++ не может вывести T при вызове Foo <T> :: Foo (T &&)?
Учитывая следующую структуру шаблона: template&lt;typename T&gt; struct Foo { Foo(T&amp;&amp;) {} }; Это компилируется и Tвыводится так int: auto f = Foo(2); Но это не компилируется: https://godbolt.org/z/hAA9TE int x = 2; auto f = Foo(x); /* &lt;source&gt;:12:15: error: no viable constructor or deduction guide for deduction of template arguments of …


1
несоответствие clang / gcc в специализации классов
Я столкнулся с этой проблемой, пытаясь специализировать tuple_size/ tuple_elementдля пользовательского класса в C ++ 17 для структурированного связывания. Ниже код компилируется в GCC, но не в clang (обе версии транка, см. Ссылку ниже). #include &lt;type_traits&gt; template&lt;typename T, typename... Ts&gt; using sfinae_t = T; template&lt;typename T, bool... Bs&gt; using sfinae_v_t = …

2
Вариация на тему типа прокалывания: на месте тривиальная конструкция
Я знаю, что это довольно распространенная тема, но насколько легко найти типичный UB, я не нашел этот вариант до сих пор. Итак, я пытаюсь официально представить объекты Pixel, избегая при этом фактической копии данных. Это действительно? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v&lt;Pixel&gt;); Pixel* …

1
Может ли указатель на неполный тип быть неполным?
Может int (*)[]быть неполного типа? C 2018 6.2.5 1 говорит: В различных точках в единице перевода тип объекта может быть неполным (без достаточной информации для определения размера объектов этого типа) или полным (имеющим достаточную информацию). Таким образом, кажется, что если размер типа известен, тип завершен. 6.2.6.1 28 указывает, что определенные …

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