0

「*」、「&」などのローカル変数や記号を減らして、コードを読みやすくする方法に問題があります。

私がこのようなものを書くとき:

inline std::string&
EmbraceBySQuote (
            std::string& str ) {
    str = "'" + str + "'";
    return str;
}  /* -----  end of function EmbraceBySQuote ----- */

私はこのようなことをすることはできません

fmter % ( *detail::EmbraceBySQuote ( &table.GetTableName ( ) ) );
table.GetTableName ( ) //returns std::string

エラーが発生する

invalid initialization of non-const reference of type ... from a temporary of type rvalue ...

ポインタも同じ

inline std::string*
EmbraceBySQuote (
            std::string* str ) {
    *str = "'" + *str + "'";
    return str;
}  /* -----  end of function EmbraceBySQuote ----- */


fmter % ( *detail::EmbraceBySQuote ( &table.GetTableName ( ) ) );

taking address of temporary 

だから私はこのようなものが必要です

std::string tableName = table.GetTableName ( );
fmter % ( *detail::EmbraceBySQuote ( &tableName ) );

新しい変数を作成して参照を使用せずに、よりシンプルにする方法を知っていますか?

4

2 に答える 2

2

あなたのコードは、多くのことを理解していないことを示しています。

例えば:

&table.GetTableName ( )

あなたが述べたように、をtable.GetTableName()返しますstd::string。おそらくそれは値を返しています。つまり、一時的なものを返しています。

したがって、最初の問題:一時的なアドレスを取得することはできません。したがって&table.GetTableName()、正当な C++ コードではありません。は必要ありません&

2 番目の問題:仮のアドレスを取得できたとしても、ポインターEmbraceBySQuoteは取得しません。参照がかかります。参照とポインタは別のものです。参照を期待する関数にポインターを渡すことはできません (ポインターへの参照でない限り)。

3 番目の問題:参照EmbraceBySQuoteによってパラメーターを取得します。テンポラリは非参照にバインドできません。したがって、この関数に一時的なものを渡すことはできません。constconst

4 番目の問題:

*detail::EmbraceBySQuote

参照はポインターではないため、逆参照することはできません。

立ち止まって C++ の紹介に戻り、そこから始める必要があります。参照とポインターの基本的な C++ 原則について、非常に混乱した考えがあります。そして、あなたはそれを整理する必要があります。

于 2012-11-10T03:44:01.310 に答える
1

は をtable.GetTableName()返す可能性const std::string&が高く、より可能性が高いのは を返す可能性が高く、const char*その結果、コンパイラは に渡す一時的な std::string を考案する必要があり、コンパイラが考案した一時変数EmbraceBySQuoteは非 const 参照として渡すことはできません (コンパイラサポートしている場合があります)。ただし、そうである場合は非標準です)。

これを修正するにはいくつかの方法があります。そのうちの 1 つを次に示します。

inline std::string EmbraceBySQuote(const char* str)
{
    std::string ans = str;
    ans.insert(ans.begin(), '\'');
    ans.push_back('\'');
    return ans;
}

inline std::string EmbraceBySQuote(const std::string& str)
{
    std::string ans = "'" + str + "'";
    return ans;
}

注: これらは in-parameter in-place を変更しません。それが必要な場合は、結果を自分で割り当てる必要があります。

std::string foo = "foo";
foo = EmbraceBySQuote(foo);
于 2012-11-10T03:31:06.257 に答える