我有一个问题,如何使用较少的局部变量和符号(例如“*”,“&”
)使代码更具可读性当我写这样的东西时:
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 ) );
如果没有创建新变量并使用引用,您知道如何使其更简单吗?
答案 0 :(得分:2)
你的代码背叛了对......很多东西缺乏了解。
例如:
&table.GetTableName ( )
如您所述,table.GetTableName()
会返回std::string
。据推测,这是一个值。这意味着它正在返回一个临时的。
所以第一个问题:你不能拿一个临时的地址。所以&table.GetTableName()
不是合法的C ++代码。您不需要&
。
第二个问题:即使你可以获取临时地址,EmbraceBySQuote
也不会使用指针。它需要引用。引用和指针是不同的东西。您不能将指针传递给期望引用的函数(除非它是对指针的引用)。
第三个问题:EmbraceBySQuote
通过非const
引用获取其参数。临时无法绑定到非const
引用。所以你不能将临时函数传递给这个函数。
第四个问题:
*detail::EmbraceBySQuote
引用不是指针,因此您无法取消引用。
你需要停下来然后回到intro-to-C ++并从那里开始。关于引用和指针的基本C ++原则,你有一些非常混乱的想法。你需要解决这个问题。
答案 1 :(得分:1)
table.GetTableName()
可能会返回const std::string&
,或者更有可能返回const char*
因此,编译器必须设法将临时std :: string传递给{ {1}},并且编译器设计的临时值不能作为非const引用传递(您的编译器可能支持它,但如果它是非标准的话,则它是非标准的。)
您可以通过多种方式解决此问题,其中一种方法如下所示:
EmbraceBySQuote
注意:这些不会就地修改in-parameter。如果这是您想要的结果,您必须自己分配结果。
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;
}