Traditionally using opaque structs in D when interfacing with C (where one should only ever use such structs with a pointer) are implemented like so:
----- struct S; void main() { S* s1; // ok S s2; // linker error } ----- Unfortunately this tends to spawn unreadable error messages: ----- test.d(3): Error: struct test.S unknown size test.d(3): Error: struct test.S no size yet for forward reference test.d(3): Error: struct test.S unknown size test.d(3): Error: struct test.S no size yet for forward reference test.d(12): Error: variable test.main.s2 no definition of struct S test.d(3): Error: struct test.S unknown size test.d(3): Error: struct test.S no size yet for forward reference ----- I was thinking we could also implement opaque structs like so: ----- struct S { @disable this(); @disable this(this); } void main() { S* s1; S s2; } ----- The error is then: ----- Error: variable test.main.s2 initializer required for type S ----- The question is, is a disabled ctor and postblit enough? Note that if we implement Issue 8728[1], we could even create a better error message via: ----- struct S { @disable("S is an opaque C type and must only be used as a pointer") this(); @disable("S is an opaque C type and must only be used as a pointer") this(this); } void main() { S* s1; // ok S s2; // user error } ----- [1] : http://d.puremagic.com/issues/show_bug.cgi?id=8728