1

I have the following code:

class C {
private:
    void *data;

public:
    constexpr C(nullptr_t) : data(nullptr) { }
    C(int i) : data(new int(i)) { }
};

I have created a constructor which takes nullptr_t, so that I can have code similar to the following:

C foo(2);
// ...
foo = nullptr;

Code similar to this has worked previously on MSVC, however this code fails to compile on GCC 5.3.1 (using -std=c++14) with on the closing bracket of C(nullptr_t) with error: function definition does not declare parameters. Even if i give the parameter a name (in this case _), I get error: expected ')' before '_'. This also fails if the constexpr keyword is removed.

Why am I unable to declare such a constructor, and what are any possible workarounds?

Nick Mertin
  • 1,149
  • 12
  • 27

1 Answers1

1

You must be a fan of "using namespace std", and you just got tripped up by it:

constexpr C(std::nullptr_t) : data(nullptr) { }

gcc 5.3.1 compiles this, at --std=c++14 conformance level:

[mrsam@octopus tmp]$ cat t.C
#include <iostream>

class C {
private:
    void *data;

public:
    constexpr C(std::nullptr_t) : data(nullptr) { }
    C(int i) : data(new int(i)) { }
};
[mrsam@octopus tmp]$ g++ -g -c --std=c++14 -o t.o t.C
[mrsam@octopus tmp]$ g++ --version
g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Community
  • 1
  • 1
Sam Varshavchik
  • 114,536
  • 5
  • 94
  • 148