当编译器试图推断模板参数类型时,无论成功与否,我都在寻找从编译器的逻辑中获取一些跟踪日志的方法。例如,给定代码:
#include <iostream>
#include <vector>
#include <type_traits>
template<typename T>
decltype(auto) foo(T&& t) -> decltype(t + t)
{
return t + t;
}
template<typename T>
decltype(auto) foo(T&& t) -> decltype(t.size())
{
return t.size();
}
int main()
{
std::cout << foo(10) << '\n'
<< foo(std::vector<int>{1,2,3}) << '\n';
}我很想收到这样的信息:
foo(10)
candidate: decltype(auto) foo(T&& t) -> decltype(t * t): seems valid
candidate: decltype(auto) foo(T&& t) -> decltype(t.size()): wrong one编译器已经很擅长它了,例如提供了不明确的调用。如果我打电话给foo(std::string("qwe"));,我会得到:
main.cpp: In function 'int main()':
main.cpp:23:31: error: call of overloaded 'foo(std::__cxx11::basic_string<char>)' is ambiguous
foo(std::string("qwe"));
^
main.cpp:7:20: note: candidate: decltype ((t + t)) foo(T&&) [with T = std::__cxx11::basic_string<char>; decltype ((t + t)) = std::__cxx11::basic_string<char>]
decltype(auto) foo(T&& t) -> decltype(t + t)
^~~
main.cpp:13:20: note: candidate: decltype (t.size()) foo(T&&) [with T = std::__cxx11::basic_string<char>; decltype (t.size()) = long unsigned int]
decltype(auto) foo(T&& t) -> decltype(t.size())
^~~如果这种明确的反馈是不可能的,也许有一种方法可以查看“半编译”代码,而所有的模板演绎都已经完成了?
任何一个编译器都有这样的特性吗?gcc,嘎嘎,先生?
回溯:
这个例子很简单,也很明显,但是我确实用ranges::v3库做了实验,并且很难理解为什么一个特定的案例可以工作,而另一个则不行。(从技术上讲,iterator_range<Handmade InputIterator>与view::take(3)一起使用管道返回void,而不是一些花哨的range,但不是这个问题。我想追踪几乎同一行的演绎,但是用iterator_range<ContiguousIterator>和看到的差别。
https://stackoverflow.com/questions/48827410
复制相似问题