ここから:
struct piecewise_construct_t {}; constexpr piecewise_construct_t piecewise_construct = {}; const int magic_number = 42; inline std::tuple<int> make_magic() { return std::tuple<int>( piecewise_construct, magic_number ); }
この関数は、ODR ([basic.def.odr] §3.2/6) に 2 回違反します。これは、コンストラクター 2 の引数のどちらも左辺値から右辺値への変換を受け取らないためです。したがって、それらはアドレスで渡されますが、const (および constexpr) は内部リンケージを意味するため、アドレスは TU に依存します。
最初はそうだと思ったのですが、問題はmagic_number
内部リンケージです。内部リンケージがあるため、本質的にmagic_number
は、それらが異なる翻訳単位の異なる変数であるかのように扱われ、したがって同じ変数の複数の定義としてではありませんか? C++ 標準の最新のワーキング ドラフトの引用を使用して、誰かがこれを指定できますか?