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

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

Рассмотрим следующие два класса и интерфейс: public class Class1 {} public class Class2 {} public interface Interface1 {} Почему второй вызов mandatoryвызывает перегруженный метод с Class2, если getInterface1и Interface1не имеет отношения с Class2? public class Test { public static void...

11
Прерывание изменений в 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...

11
Могут ли быть разные неявные объекты, основанные на более позднем решении времени выполнения в 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); } }...

11
GCC реализация угловых скобок включает в себя. Почему это должно быть так, как описано ниже?

Этот документ в разделе 2.6 «Вычисленные включения» имеет следующий параграф: Если строка расширяется до потока токенов, начинающегося с токена <и включающего токен>, то токены между <и первым> объединяются, чтобы сформировать имя файла для включения. Любой пробел между токенами...

10
Почему добавление второго impl предотвращает принудительное приведение аргумента?

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

10
Вывод аргумента шаблона для аргумента типа функции

Рассмотрим следующую программу. #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } Программа успешно компилируется, и ее вывод g( 42 ); Теперь давайте...

10
Неожиданное исключение InvalidOperationException при попытке изменить отношение через значение свойства по умолчанию

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

10
Значение char, установленное в CHAR_MAX, гарантированно обернуто в CHAR_MIN?

Мой код: #include <stdio.h> #include <limits.h> 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, она...

10
Несовместимое усечение беззнаковых целочисленных выражений битового поля между C ++ и C в разных компиляторах

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

10
Вывод типов аргументов шаблона шаблона C ++

У меня есть код, который находит и распечатывает совпадения шаблона, как проходя через контейнер строк. Печать выполняется в функции foo, которая является шаблонной. Код #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string>...

9
Что значит «сильно случается раньше»?

Фраза «сильно случается раньше» используется несколько раз в проекте стандарта C ++. Например: Завершение [basic.start.term] / 5 Если завершение инициализации объекта со статической продолжительностью хранения сильно происходит до вызова std :: atexit (см. [Support.start.term]), вызов функции...

9
Пытаясь понять шаблоны и поиск имени

Я пытаюсь понять следующие фрагменты кода Фрагмент №1 template <typename T> struct A { static constexpr int VB = T::VD; }; struct B : A<B> { }; Ни gcc9, ни clang9 не выдают здесь ошибку. В. Почему этот код компилируется? Разве мы не являемся экземплярами A<B>при наследовании от B?...

9
Порядок выполнения оператора new и аргумента конструктора

Спецификация C ++ определяет порядок operator newи конструктор Aв new C(A()). G ++ пусть порядок будет A()-> new-> C(), но clang ++ пусть это будет new-> A()-> C(). Разница вызвана неопределенным поведением? g ++: 7.4.0 clang ++: 10.0.0 #include <iostream> #include <cstdlib>...

9
Может ли указатель на неполный тип быть неполным?

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

9
несоответствие clang / gcc в специализации классов

Я столкнулся с этой проблемой, пытаясь специализировать tuple_size/ tuple_elementдля пользовательского класса в C ++ 17 для структурированного связывания. Ниже код компилируется в GCC, но не в clang (обе версии транка, см. Ссылку ниже). #include <type_traits> template<typename T,...

9
Неуказанное неявное создание объекта

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