我一直在SVN中使用GCC中的lite概念進行實驗。我遇到了一個我懷疑是由於缺乏理解而導致的問題,如果有人能指出我的方向,我會很感激。我的代碼是:概念和聲明順序
#include <iostream>
#include <string>
// Uncomment this declaration to change behaviour
//void draw(const std::string&);
template <typename T>
concept bool Drawable() {
return requires (const T& t) {
{ draw(t) }
};
}
void draw(const std::string& s)
{
std::cout << s << "\n";
}
int main()
{
static_assert(Drawable<std::string>()); // Fails
}
這裏我定義了一個簡單的概念,Drawable
,其目的是要求一個給定的const T&
類型的參數,功能draw(t)
編譯。
然後我定義了一個函數draw(const std::string&)
,它將字符串「繪製」爲cout
。最後,我檢查std::string
是否與Drawable
概念相符 - 我預料它會這樣做,因爲調用static_assert
時適當的draw()
函數在範圍之內。
但是,靜態斷言失敗,除非我包含draw(const std::string&)
之前的的聲明定義,我不知道爲什麼。
這是預期的行爲與概念,還是我做錯了什麼?
沼澤標準的ADL問題與數百個愚蠢。 ADL不會檢查全局名稱空間,因爲所涉及的類型都不是它的成員。取消註釋模板上方的聲明可以使非限定名稱查找在模板定義上下文中找到它。 – Columbo
所以,如果他把名字空間標準中的無效繪製聲明。它應該工作。 – West
我錯過了開頭句子中的SVN參考。這有什麼重要的意義? –