なぜかコンパイルできる¶
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';
}