考慮到以下玩具代碼:
#include <boost/hana/transform.hpp>/span>
#include <range/v3/view/transform.hpp>/span>
auto constexpr f = [](auto) {
using namespace ranges::views;
auto xxx = transform;
};
void caller(){
使用 boost::hana::transform。
f(1)。
它在GCC和MS的編譯器中編譯得很好,這意味著使用boost::hana::transform;并不影響f的主體中可用的名字,所以它毫不含糊地指出xxx是ranges::view::transform。
另一方面,如果我將using boost::hana::transform;改為using namespace boost::hana;,那么Visual Studio聲稱f的主體中的transform是一個模糊的名字。
這是GCC或Visual Studio的一個錯誤嗎?它是一個已知的錯誤嗎?它是什么原因造成的?
(Demo.)
uj5u.com熱心網友回復:
這是一個MSVC bug,與generic lambdas有關。一個最小的例子是
void foo(){}。
namespace B {
void foo() {}。
}
auto moo = [](auto) {
foo()。
};
int main() {
使用 命名空間 B。
moo(1)。
它在c 17和c 20的設定下重現。
眾所周知,MSVC對模板實體化和兩階段名稱查找的處理不符合要求。在最新版本的編譯器中,許多這樣的錯誤被修復了,但顯然不是全部。在這里,在moo被實體化之后,foo的名字顯然在實體化的背景關系中被查找到。這不應該發生,因為它不是一個從屬名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/326358.html
標籤:
