Warning: ISO C++ forbids converting a string constant to ‘char*’ for a static `constexpr char*` data...
This question already has an answer here:
constexpr const vs constexpr variables? [duplicate]
3 answers
Why does this code return a warning
warning: ISO C++ forbids converting a string constant to ‘char*’
[-Wwrite-strings]
if
A constexpr specifier used in an object declaration or non-static
member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
(cppreference.com)
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
If I add a const after constexpr, the warning is gone:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{};
With g++ --version = g++ (GCC) 8.2.1 20181127,
compilation g++ -O3 -std=c++2a -Wall main.cpp -o main.
Does the constexpr not imply const on static data members?
c++ c++11 static constexpr
marked as duplicate by Community♦ Jan 19 at 11:54
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
constexpr const vs constexpr variables? [duplicate]
3 answers
Why does this code return a warning
warning: ISO C++ forbids converting a string constant to ‘char*’
[-Wwrite-strings]
if
A constexpr specifier used in an object declaration or non-static
member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
(cppreference.com)
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
If I add a const after constexpr, the warning is gone:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{};
With g++ --version = g++ (GCC) 8.2.1 20181127,
compilation g++ -O3 -std=c++2a -Wall main.cpp -o main.
Does the constexpr not imply const on static data members?
c++ c++11 static constexpr
marked as duplicate by Community♦ Jan 19 at 11:54
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50
add a comment |
This question already has an answer here:
constexpr const vs constexpr variables? [duplicate]
3 answers
Why does this code return a warning
warning: ISO C++ forbids converting a string constant to ‘char*’
[-Wwrite-strings]
if
A constexpr specifier used in an object declaration or non-static
member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
(cppreference.com)
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
If I add a const after constexpr, the warning is gone:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{};
With g++ --version = g++ (GCC) 8.2.1 20181127,
compilation g++ -O3 -std=c++2a -Wall main.cpp -o main.
Does the constexpr not imply const on static data members?
c++ c++11 static constexpr
This question already has an answer here:
constexpr const vs constexpr variables? [duplicate]
3 answers
Why does this code return a warning
warning: ISO C++ forbids converting a string constant to ‘char*’
[-Wwrite-strings]
if
A constexpr specifier used in an object declaration or non-static
member function (until C++14) implies const. A constexpr specifier used in a function or static member variable (since C++17) declaration implies inline.
(cppreference.com)
#include <cassert>
#include <string>
#include <iostream>
struct A
{
// warning: ISO C++ forbids converting a string constant to ‘char*’
static constexpr char* name_ = "A";
static constexpr char* name() { return name_; };
};
int main()
{};
If I add a const after constexpr, the warning is gone:
#include <cassert>
#include <string>
#include <iostream>
struct A
{
static constexpr const char* name_ = "A";
static constexpr const char* name() { return name_; };
};
int main()
{};
With g++ --version = g++ (GCC) 8.2.1 20181127,
compilation g++ -O3 -std=c++2a -Wall main.cpp -o main.
Does the constexpr not imply const on static data members?
This question already has an answer here:
constexpr const vs constexpr variables? [duplicate]
3 answers
c++ c++11 static constexpr
c++ c++11 static constexpr
edited Jan 18 at 17:15
tmaric
asked Jan 18 at 16:47
tmarictmaric
2,7382052
2,7382052
marked as duplicate by Community♦ Jan 19 at 11:54
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Community♦ Jan 19 at 11:54
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50
add a comment |
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50
add a comment |
2 Answers
2
active
oldest
votes
constexpr does imply const, but in this case it applies const to the "wrong thing".
constexpr char*
is basically the same as
char * const
which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.
constexpr const char*
on the other hand, is basically the same as
char const * const
which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.
add a comment |
There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:
constexpr const char* ch = "StackOverflow!";
Which declares a constexpr pointer to const.
1
I remember the ruleconstbinds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses.constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.
– Eljay
Jan 18 at 17:03
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
constexpr does imply const, but in this case it applies const to the "wrong thing".
constexpr char*
is basically the same as
char * const
which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.
constexpr const char*
on the other hand, is basically the same as
char const * const
which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.
add a comment |
constexpr does imply const, but in this case it applies const to the "wrong thing".
constexpr char*
is basically the same as
char * const
which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.
constexpr const char*
on the other hand, is basically the same as
char const * const
which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.
add a comment |
constexpr does imply const, but in this case it applies const to the "wrong thing".
constexpr char*
is basically the same as
char * const
which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.
constexpr const char*
on the other hand, is basically the same as
char const * const
which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.
constexpr does imply const, but in this case it applies const to the "wrong thing".
constexpr char*
is basically the same as
char * const
which is a constant pointer to a non-const char. This won't work because string literals have the type const char[N] so it would cast away the constness of the array elements.
constexpr const char*
on the other hand, is basically the same as
char const * const
which is a constant pointer to a constant char, which is what you want as it preserves the constness of the elements.
edited Jan 18 at 17:46
Remy Lebeau
336k18259453
336k18259453
answered Jan 18 at 16:52
NathanOliverNathanOliver
92.4k16129195
92.4k16129195
add a comment |
add a comment |
There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:
constexpr const char* ch = "StackOverflow!";
Which declares a constexpr pointer to const.
1
I remember the ruleconstbinds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses.constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.
– Eljay
Jan 18 at 17:03
add a comment |
There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:
constexpr const char* ch = "StackOverflow!";
Which declares a constexpr pointer to const.
1
I remember the ruleconstbinds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses.constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.
– Eljay
Jan 18 at 17:03
add a comment |
There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:
constexpr const char* ch = "StackOverflow!";
Which declares a constexpr pointer to const.
There is a usual difference between a constant pointer and a pointer to constant. By making your constexpr char* you made a pointer itself a constexpr (and, of course, const), but it still attempts to point at non-const character - and this is wrong, as string literals are const. Solution:
constexpr const char* ch = "StackOverflow!";
Which declares a constexpr pointer to const.
answered Jan 18 at 16:50
SergeyASergeyA
43k53886
43k53886
1
I remember the ruleconstbinds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses.constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.
– Eljay
Jan 18 at 17:03
add a comment |
1
I remember the ruleconstbinds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses.constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.
– Eljay
Jan 18 at 17:03
1
1
I remember the rule
const binds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses. constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.– Eljay
Jan 18 at 17:03
I remember the rule
const binds to the thing to its immediate left (unless its first, in which case it binds to the thing to its immediate right). In my code, I tend to favor the general case, rather than the except-to-the-general rule in the parentheses. constexpr, when I use it (not frequently), I always put on the left as the first thing. I've not been bitten by the OP's situation yet.– Eljay
Jan 18 at 17:03
add a comment |
stackoverflow.com/questions/28845058/…
– Mat
Jan 18 at 16:50
stackoverflow.com/questions/14116003/…
– Brandon Lyons
Jan 18 at 16:50