コンテンツにスキップ

なぜかコンパイルできる

C++ の規格上コンパイルできる、不思議な見た目のコードの紹介です。

ソースコードに URL

int main()
{
    https://cppmap.github.io
    return 0;
}

main 関数 try ブロック

int main()
try
{

}
catch (...)
{
    return -1;
}

添字式の入れ替え

#include <iostream>

int main()
{
    int a[3] = { 10, 20, 30 };

    std::cout << 2[a] << '\n';

    for (int i = 0; i < 3; ++i)
    {
        std::cout << i[a] << '\n';
    }
}

括弧の連続

int main()
{
    {};
    []{};
    [](){};
    [](){}();
    [[]][]{};
    []()[[]]{};
    [[]][]{}();
    [[]][](){};
    []()[[]]{}();
    [[]][](){}();
    [[]][]()[[]]{};
    [[]][]()[[]]{}();
}

空のプリプロセッサディレクティブ

#
#include <iostream>
#

int main()
{
    #
}

--> 演算子

#include <iostream>

int main()
{
    int i = 10;

    while (i --> 0)
    {
        std::cout << i << '\n';
    }
}

同じ関数

#include <iostream>

using ll = long long;

void f(unsigned ll)
{
    std::cout << "A\n";
}

void f(unsigned long long)
{
    std::cout << "B\n";
}

int main()
{
    f(123ull);
}

戻り値が無いのに [[nodiscard]]

[[nodiscard]] void Func()
{

}

int main()
{
    Func(); // 警告は出ない
}

長い関数

struct C
{
    inline virtual volatile constexpr const unsigned long long int f() const noexcept final = delete;
};

int main()
{

}

名前空間エイリアスの再帰

namespace A
{
    namespace A = A;

    void f() {}
}

int main()
{
    A::A::A::A::A::A::f();
}

struct S
{
    static const int i = 42;
};

int main()
{
    return S::S::S::S::S::S::i;
}

typedef の場所 1

long unsigned typedef int long Uint64;

int main()
{
    Uint64 i = 123ull;
}

typedef の場所 2

int main()
{
    if (typedef int Int; true)
    {
        Int a = 0;
    }

    switch (typedef int Int; 0)
    {
    case 0:
        Int a = 0;
        break;
    }
}

+-

#include <iostream>

int main()
{
    int a = 0 +-+-+-+-+-+-+-+-+ 1 +-+-+-+-+-+-+-+-+ 2;
    int b = 0 + + + + + + + + + 1 - - - - - - - - - 2;

    std::cout << a << '\n';
    std::cout << b << '\n';
}