Результаты поиска по запросу "language-lawyer"

2 ответа

@VittorioRomeo: Еще одно редактирование - я склонен это сделать.

отрим следующий сценарий: std::array<int, 8> a; auto p = reinterpret_cast<int(*)[8]>(a.data()); (*p)[0] = 42;Этонеопределенное поведение? Я думаю, что это. a.data() возвращаетint*, который не совпадает сint(*)[8] правила наложения ...

2 ответа

 псевдоним структуры массивом с помощью анонимного члена структуры в объединении - это явно определенное поведение.

рые времена до ISO C следующий код не удивил бы никого: struct Point { double x; double y; double z; }; double dist(struct Point *p1, struct Point *p2) { double d2 = 0; double *coord1 = &p1.x; double *coord2 = &p2.x; int i; for (i=0; i<3; i++) { ...

4 ответа

, Если это так, я не знал о таком требовании в стандарте, и это не связано с требованием, чтобы все адреса были представлены в

родолжение C ++ длядругой мой вопрос [https://stackoverflow.com/q/48384399/3545273] В старые времена до ISO C следующий код не удивил бы никого: struct Point { double x; double y; double z; }; double dist(struct Point *p1, struct Point *p2) { ...

ТОП публикаций

2 ответа

Это определенно проясняет ситуацию. Я бы, наверное, никогда не подошел бы к этому самому анализу стандарта. Я думаю, что понял, спасибо!

отрим простой пример: template <class T> struct tag { }; int main() { auto foo = [](auto x) -> decltype(bar(x)) { return {}; }; tag<int> bar(tag<int>); bar(tag<int>{}); // <- compiles OK foo(tag<int>{}); // 'bar' was not declared in this scope ...

1 ответ

over.match.ctor говорит: «Для прямой инициализации или инициализации по умолчанию, которая не находится в контексте инициализации копирования, все функции-кандидаты являются конструкторами класса инициализируемого объекта. Для инициализации копирования функции-кандидаты все конвертирующие конструкторы этого класса. Список аргументов - это список выражений или выражение присваивания инициализатора. " Это означает, что мы рассматриваем только конвертирующие конструкторы.

код прекрасно компилируется с GCC 5.X, MSVC, но GCC 6.X выдает ошибку: "преобразование в 'a' из списка инициализаторов будет использовать явный конструктор 'a :: a ()'"лязг"выбранный конструктор явно в ...

1 ответ

@Brian Public сейчас.

е следующее: struct X { X() {} X(X&&) { puts("move"); } }; X x = X();В C ++ 14 перемещение может быть исключено, несмотря на то, что конструктор перемещения имеет побочные эффекты благодаря [class.copy] / 31, Такое исключение операций ...

4 ответа

Примеры в стандарте

мер, вместо void shared_ptr::reset() noexcept; template <typename Y> void shared_ptr::reset(Y* ptr);можно подумать template <typename Y = T> void shared_ptr::reset(Y* ptr = nullptr);Я думаю, что разница в производительности здесь незначительна, ...

2 ответа

 Случай, там нет значения, поэтому нет предупреждения.

тав о самом неприятном разборе, я немного поэкспериментировал и нашел эту программу. Есть две очень похожие строки. Один из них выдает предупреждения как в g ++ 7, так и в clang ++ - 3.9, другой - нет. int main() { void(); // no warning int(); ...

2 ответа

 точно также, сгенерированный код - это что-то странное. Это должно быть дефектом, хотя.

для кода ниже производит: void doit(const T1 &, const T2 &) [T1 = unsigned long, T2 = int] t1 == t2 t1 == (T1)t2 t1 != (T1&)t2 t1 == (T1&&)t2Я понимаю чтоt1 == t2 дело просто неотъемлемая реклама. Второй случайt1 == (T1)t2 это то же самое, ...

2 ответа

 сама специализация, а не шаблон.

.deduct.type] пункт 8 [http://eel.is/c++draft/temp.deduct.type#8]перечисляет все выведенные контексты, но, похоже, не включаетtemplate-name<TT> гдеtemplate-name относится к шаблону класса иTT ссылается на аргумент шаблона шаблона. Это выведенный ...