C++ WAT
От: Evgeny.Panasyuk Россия  
Дата: 30.10.15 09:33
Оценка: 58 (7) :))) :))) :))) :)
http://www.youtube.com/watch?v=rNNnPrMHsAA
#include <iostream>

bool fermat()
{
    constexpr int threshold = 100;
    int a = 1, b = 1, c = 1;
    while(true)
    {
        if( a*a*a + b*b*b == c*c*c )
            return true;
        ++a;
        if(a > threshold)
        {
            a = 1;
            ++b;
        }
        if(b > threshold)
        {
            b = 1;
            ++c;
        }
        if(c > threshold)
            c = 1;
    }
    return false;
}

int main()
{
    using namespace std;
    cout << boolalpha << fermat() << endl;
}

LIVE DEMO
clang++ -std=c++1z -O3 -Wall main.cpp && ./a.out
true

Объяснение (частичное) на видео.
Re: C++ WAT
От: T4r4sB Россия  
Дата: 30.10.15 10:08
Оценка:
Ну почему так — понятно. Вот только разве компилятор предупреждение не написал?
Re[2]: C++ WAT
От: Evgeny.Panasyuk Россия  
Дата: 30.10.15 10:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну почему так — понятно.


В более сложном коде может быть реальный WAT.

TB>Вот только разве компилятор предупреждение не написал?


Нет, причём там -Wall.
Re[3]: C++ WAT
От: monah_tuk Пират http://htrd.su
Дата: 30.10.15 10:35
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нет, причём там -Wall.


А если -Wextra?

UPD: GCC 5.1.0 собирает и так всё и крутится в бесконечном цикле. Clang 3.6.0 действительно проглатил и -Wextra и -Wpedantic не помогло.
Re: C++ WAT
От: VTT http://vtt.to
Дата: 30.10.15 11:14
Оценка:
EP>Объяснение (частичное) на видео.

Человек на видео упоминает про бесконечный цикл без побочных эффектов, который компилятор якобы оптимизирует.
Но мне кажется, что проблема тут как раз в отсутствии определения этого бесконечного цикла (и даже в отсутствии попыток это сделать).
return false выкидывается так как в цикле нет условий для прерывания, а оставшийся цикл выкидывается по принципу "программист же не дурак, зачем бы он стал писать бесконечный цикл" без каких-либо проверок.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[2]: C++ WAT
От: Evgeny.Panasyuk Россия  
Дата: 30.10.15 11:29
Оценка:
Здравствуйте, VTT, Вы писали:

EP>>Объяснение (частичное) на видео.

VTT>Человек на видео упоминает про бесконечный цикл без побочных эффектов, который компилятор якобы оптимизирует.
VTT>Но мне кажется, что проблема тут как раз в отсутствии определения этого бесконечного цикла (и даже в отсутствии попыток это сделать).
VTT>return false выкидывается так как в цикле нет условий для прерывания, а оставшийся цикл выкидывается по принципу "программист же не дурак, зачем бы он стал писать бесконечный цикл" без каких-либо проверок.

Возможно так и есть.
Вот стандарт:

1.10/24 The implementation may assume that any thread will eventually do one of the following:
— terminate,
— make a call to a library I/O function,
— access or modify a volatile object, or
— perform a synchronization operation or an atomic operation.
[ Note: This is intended to allow compiler transformations such as removal of empty loops, even when termination cannot be proven. —end note ]

Re[3]: C++ WAT
От: T4r4sB Россия  
Дата: 30.10.15 11:44
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>В более сложном коде может быть реальный WAT.


Это да.

EP>Нет, причём там -Wall.


А вот это уже косяк.
Есть ещё вроде режим "включить все-все-все предупреждения", но он слишком много хреноты включает.
Re: C++ WAT
От: B0FEE664  
Дата: 30.10.15 14:10
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>http://www.youtube.com/watch?v=rNNnPrMHsAA

Кто не хочет видео, тот может смотреть текст тут.

Я вот чего не понимаю: почему нельзя так:
struct A
{
    template <int n>
    A() { }
                                   
    A(int) : A::A<2>() {}
};

? Вроде же нет прямого запрета.
И каждый день — без права на ошибку...
Re[2]: C++ WAT
От: Evgeny.Panasyuk Россия  
Дата: 30.10.15 15:00
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>? Вроде же нет прямого запрета.


Из стандарта:

[Note: Because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. —end note]

Отредактировано 30.10.2015 15:00 Evgeny.Panasyuk . Предыдущая версия .
Re[3]: C++ WAT
От: B0FEE664  
Дата: 30.10.15 16:00
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

BFE>>? Вроде же нет прямого запрета.

EP>Из стандарта:
EP>

EP>[Note: Because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. —end note]


Мне на этом форуме как-то раз говорили, что Note не являются частью стандарта, а являются выводами из его положений.
Однако, в данном случае, как мне кажется, сделанный вывод не соответствует положениям стандарта.

Т.е. положение верно для, скажем, объявления переменной:
A a<2>();// так нельзя.


А вот для delegating constructor это не так.

A mem-initializer-list can delegate to another constructor of the constructor’s class using any class-ordecltype
that denotes the constructor’s class itself. If a mem-initializer-id designates the constructor’s class,
it shall be the only mem-initializer; the constructor is a delegating constructor, and the constructor selected
by the mem-initializer is the target constructor.

  Скрытый текст


mem-initializer:
    mem-initializer-id ( expression-listopt)
    mem-initializer-id braced-init-list
mem-initializer-id:
    class-or-decltype
    identifier

class-or-decltype:
    nested-name-specifieropt class-name
    decltype-specifier

nested-name-specifier:
    ::
    type-name ::
    namespace-name ::
    decltype-specifier ::
    nested-name-specifier identifier ::
    nested-name-specifier templateopt simple-template-id ::

simple-template-id:
    template-name < template-argument-listopt>

class-name:
    identifier
    simple-template-id

template-name:
    identifier


по синтаксису, вроде, подходит


Т.е. вот такой вариант законен:
struct A
{
    A() { }
    A(int) : A::A() {}
};


Почему же нельзя задать шаблонный параметр конструктора?
Теоретически, даже такое должно компилироваться:
struct A
{
    template <int n> A(){}                               
    A(int) : A::template A<2>(){}
    
};
И каждый день — без права на ошибку...
Re[4]: C++ WAT
От: _NN_ www.nemerleweb.com
Дата: 30.10.15 19:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Почему же нельзя задать шаблонный параметр конструктора?

BFE>Теоретически, даже такое должно компилироваться:
Практически можно сделать конструктор с шаблоном:
struct A
{
    template <int n> A(){} // OK
};

Только вызвать его нельзя никак
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: C++ WAT
От: B0FEE664  
Дата: 30.10.15 22:45
Оценка:
Здравствуйте, _NN_, Вы писали:

BFE>>Почему же нельзя задать шаблонный параметр конструктора?

BFE>>Теоретически, даже такое должно компилироваться:
_NN>Практически можно сделать конструктор с шаблоном:
_NN>
_NN>struct A
_NN>{
_NN>    template <int n> A(){} // OK
_NN>};
_NN>

_NN>Только вызвать его нельзя никак

Вот корректный вызов:
struct A
{
    template <int n> A(){} // OK
    A(int) : A::A<2>() {} // call of template <int n> A(){}
};

И каждый день — без права на ошибку...
Отредактировано 30.10.2015 22:45 B0FEE664 . Предыдущая версия .
Re: C++ WAT
От: fin_81  
Дата: 01.11.15 05:34
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>
#include <iostream>

bool fermat()


А давайте применим стандарт с++ (с его неопределенными поведениями форматирующими жесткий диск) как формальную систему и опровергнем теорему Ферма.
Re[2]: C++ WAT
От: jazzer Россия Skype: enerjazzer
Дата: 01.11.15 07:01
Оценка: :))) :)))
Здравствуйте, fin_81, Вы писали:

_>А давайте применим стандарт с++ (с его неопределенными поведениями форматирующими жесткий диск) как формальную систему и опровергнем теорему Ферма.


Я нашёл этому поистине чудесное доказательство, но оно в процессе сохранения форматирует носитель, на который его сохраняют.

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: C++ WAT
От: Лазар Бешкенадзе СССР  
Дата: 01.11.15 08:38
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вот стандарт:

EP>

EP>1.10/24 The implementation may assume that any thread will eventually do one of the following:
EP>— terminate,
EP>— make a call to a library I/O function,
EP>— access or modify a volatile object, or
EP>— perform a synchronization operation or an atomic operation.
EP>[ Note: This is intended to allow compiler transformations such as removal of empty loops, even when termination cannot be proven. —end note ]

EP>

Если нет явного указания на то, что в противном случае UB, то от нормального компилятора можно ожидать другой логики:

Выхода из цикла нет значит в цикле есть модификация volatile object и так "оптимизировать" нельзя. Одним словом clang на помойку.
Re[4]: C++ WAT
От: red75  
Дата: 01.11.15 09:06
Оценка:
Здравствуйте, Лазар Бешкенадзе, Вы писали:

ЛБ>Если нет явного указания на то, что в противном случае UB, то от нормального компилятора можно ожидать другой логики:


ЛБ>Выхода из цикла нет значит в цикле есть модификация volatile object и так "оптимизировать" нельзя. Одним словом clang на помойку.


Но volatile object в цикле нет, так что оптимизируем с чистой совестью. Или стандарт на помойку.

Так-то я против тупого следования букве стандарта. Но с С++ это получается очень весело.
Re[6]: C++ WAT
От: _NN_ www.nemerleweb.com
Дата: 08.11.15 11:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

VC, Clang и GCC как-то не очень радуются глядя на этот код.
На каком компиляторе удалось это собрать ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.