聲明:這個問題是爲了理解。我將在現場使用boost::lexical_cast
。 It has sort of come up in the real world in places, though.這是一個引用到非const綁定到臨時的實例嗎?
採取the following attempt在「內聯」法鑄方法:
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << "hi" << 0
).str();
std::cout << s;
}
的結果是一樣的東西0x804947c0
,因爲與"hi"
工作的operator<<
是一個免費的功能,其LHS必須採取std::ostream&
&dagger;,臨時std::ostringstream()
無法綁定到ref-to-non- const
。唯一剩下的匹配是operator<<
,需要const void*
對RHS &dagger;&dagger;。
#include <string>
#include <sstream>
#include <iostream>
int main()
{
const std::string s = static_cast<std::ostringstream&>(
std::ostringstream() << 0 << "hi"
).str();
std::cout << s;
}
結果是"0hi"
。
這主要是有道理的,因爲這需要int
的operator<<
是鹼ostream
&匕首的成員函數;&匕首;&匕首;,因此,在臨時調用時可以。該操作的結果是對ostream
基礎的引用,將下一個operator<<
鏈接到該基礎,即將其作爲(std::ostringstream() << 0) << "hi"
來讀取。
但是爲什麼然後那運行在"hi"
繼續產生預期的結果? LHS上的參考文獻還不是暫時的嗎?
讓我們專注於C++ 03;我被告知第一個例子實際上可能在C++ 11中作爲「預期」工作,因爲rvalues的catch-all操作符。
&dagger;[C++03: 27.6.2.1]: template<class charT, class traits> basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&,charT*);
&匕首;&匕首;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(const void* p);
&匕首;&匕首;&匕首;[C++03: 27.6.2.1]: basic_ostream<charT,traits>& operator<<(int n);
我想答案是沿着「將臨時參照物綁定到引用的規則遠不是那麼簡單的規則;這裏是相關的短語」。 –
這與您可以編寫函數模板'template T&lvalue(T && v){return v;}'以將非常量左值引用綁定到臨時對象的原因相同。 –
Mankarse
第一個腳註的重載不會是那些採用const char [T] *'的腳本嗎? (不是說它改變了什麼。) – Mat