3 ms·
I don't understand. When does a C89 struct display implicit conversion behavior that would justify making C++ class constructors implicit by-default? For examp
by senkora 2y ago
I don't understand. When does a C89 struct display implicit conversion behavior that would justify making C++ class constructors implicit by-default?
For example, the following code does not compile with either -std=c89 or -std=c++98, but does compile if we uncomment the constructor line:
struct Foo {
int x;
/*public: Foo(int x) : x(x) {}*/
};
int main() {
struct Foo foo = 5;
return 0;
}
$ gcc -std=c89 tmp.c
tmp.c: In function ‘main’:
tmp.c:8:20: error: invalid initializer
8 | struct Foo foo = 5;
| ^
$ g++ -std=c++98 tmp.c
tmp.c: In function ‘int main()’:
tmp.c:8:20: error: conversion from ‘int’ to non-scalar
type ‘Foo’ requested
8 | struct Foo foo = 5;
Maybe I'm missing something?
- pjmlp 2y agoYou are missing that such struct initialization did not exist when C with Classes came to be. Additionally, you are missing the whole package of struct semantics in C++, that while they should at naked eye still look like C structs, they have to also support C++ struct semantics, of memory construction, copy assignment and bitwise comparisaion. Hence why structs and classes are the same, with the difference that structs are public by default, with code generated for keeping the bitwise C semantics, until any of those operations are redifined, at which point the compiler leaves out the job to the developer.
- senkora 2y agoThank you for the response. I still don’t understand why it would be necessary for C++ to default to non-explicit constructors when C at the time did not have constructors and did not have constructor-like struct initialization that mimicked non-explicit constructors. It seems like an unforced error in the language design, rather than a concession to backwards-compatibility.