Why is it not possible to write to a file from a const member function ?

user42 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Mar 12 08:22:56 PST 2016


On Saturday, 12 March 2016 at 15:32:39 UTC, Mike Parker wrote:
> On Saturday, 12 March 2016 at 14:02:31 UTC, user42 wrote:
>
>> Why is this thing not compiling ?
>> Or, in other words, how is is possible to log something to a 
>> file from a const member function ?
>>
>
> Const member functions functions are not allowed to mutate any 
> member state at all. This includes the state of any object 
> instances that are members. Since the write method of the File 
> type is not declared as const, then you can not call it on a 
> member of type File from inside a const member function. 
> Logging, by its very definition, mutates state.
>
> Move the File instance outside of the class and it works.
>
> import std.stdio;
> private File f;
> static this() { f = stdout; }
>
> class X
> {
>   void p(string s) const
>   {
>      f.writeln!(string)(s);
>   }
> }
>
> class Y
> {
>   private string s = "Y";
>
>   override string toString() const
>   {
>      return s;
>   }
> }
>
> void main()
> {
>   auto x = new X;
>   auto y = new Y;
>
>   import std.conv: to;
>   x.p(to!string(y));
> }

Thanks for your reply.
Unfortunately it only solves the problem for this particular 
snippet.

The most interesting part of your reply is this line:
> Since the write method of the File type is not declared as 
> const,

At a quick glance I suppose it's because of the locking in 
LockingTextWriter.

I think I will probably pass this stuff to a C implementation, or 
override toString non-const, since adding const to it started 
this const avalanche in the first place.

Anyways, thanks for your input and have a nice weekend.


More information about the Digitalmars-d-learn mailing list