変更をテストしているときに私が見ていることを理解しようとしています。このプラットフォームはGCC 4.8でopenSUSE 42ですが、他の人に影響を与える可能性があります。テストコードとエラーが続きます。静的なクラス関数にconstを使用する必要があるのはなぜですか?
$ cat test.cxx
#include <string>
#if (__cplusplus >= 201103L)
# define STATIC_CONSTEXPR static constexpr
# define CONSTEXPR constexpr
#else
# define STATIC_CONSTEXPR static const
# define CONSTEXPR
#endif
struct Name
{
STATIC_CONSTEXPR char* GetName() {return "XXX";}
};
int main(int argc, char* arv[])
{
const char* name = Name::GetName();
return 0;
}
そして:
$ g++ -O3 -std=c++11 test.cxx -o test.exe
test.cxx: In static member function ‘static constexpr char* Name::GetName()’:
test.cxx:13:44: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
STATIC_CONSTEXPR char* GetName() {return "XXX";}
^
次を追加することクリアされない:
struct Name
{
STATIC_CONSTEXPR char* const GetName() {return "XXX";}
};
そして次を追加する明確にそれを行います。
struct Name
{
STATIC_CONSTEXPR const char* GetName() {return "XXX";}
};
を
Does static constexpr variable make sense?による
:
すべての変数は、constexprのが暗黙的にconstのですが、constの静的な は、ほぼ直交していると宣言
は、私はほとんど私が思った(静的 constの整数との相互作用を除きます。)わかったconstexpr
しかし私は明らかに何かが(もう一度)不足しています。私が理解しているように、C++委員会は、実際に理解しているように、物理的な宇宙の法則では不可能であっても、ファイルが保存された後に何らかの形で変更することができると考えています("XXX"
)。しかし、問題を解決するために、彼らは私たちにconstexpr
を与えました。代わりの説明はhereですが、私はその違いを生む細かい詳細がわかりません。
なぜ警告が表示されるのですか。なぜ、それをスカルクするにはstatic constepr const
が効果的に必要ですか?関数宣言に
$ uname -a
Linux opensuse-42 4.1.27-27-default #1 SMP PREEMPT Fri Jul 15 12:46:41 UTC 2016 (84ae57e) x86_64 x86_64 x86_64 GNU/Linux
opensuse-42:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/4.8/lto-wrapper
Target: x86_64-suse-linux
Configured with: ../configure --prefix=/usr ... --host=x86_64-suse-linux
Thread model: posix
gcc version 4.8.5 (SUSE Linux)
いいえ、あなたは問題を理解していない:修正はどちらかです。 "再生器の中の" XXX "のような値は、ファイルが保存された後に何らかの形で変更することができます"とは何の関係もない無意味な声明です。リテラル文字列定数 "XXX"は 'const char *'であり、失敗したコードは 'char *'としてそれを返そうとします。定数オブジェクトへのポインタは、変更可能なオブジェクトへのポインタに暗黙的に変換することはできません。これは 'constexpr'とは関係ありません。 –
'const char *'に代入するので、関数は 'const char *'を返す必要があります。 – Galik
私は明確です... constexprとしてマークされた静的関数から返される値は暗黙的に 'const'ではありません。あれは正しいですか?これは、関数本体が '...(){STATIC_CONSTEXPR char val [] =" XXX ";戻り値。 } '? – jww