Dam*_*mon 31 c++ lambda templates c++17
今天我正在玩C++ 17的类模板参数演绎.想到的第一个明显的想法是传递一个可调用的模板参数.一个可调用的,其中一个是lambda,为什么不呢.我们试试吧.
template<typename F> class foo
{
F f;
public:
foo(F in) : f(in) { f(); /* not very useful, admitted */ }
};
void bar() { puts("a"); }
int main()
{
auto a = foo(bar);
auto b = foo([](){ puts("b"); });
return (void) a, (void) b, 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是clang(5.0,r300688)对此的评价:
警告:函数'<(lambda at [source location])>'具有内部链接但未定义
代码编译并且肯定"工作正常",但警告表明编译器并不完全满意.
我已经准备好同意lambda有内部链接(匿名它在同一个翻译单元的其他地方无法访问,所以肯定它在另一个翻译单元中无法访问),但是怎么样呢.我不想从另一个翻译单元访问它.
关于缺乏定义的部分让我感到好笑,我甚至不知道如何在没有定义的情况下编写lambda.
总结:什么给出?该怎么做?我不喜欢警告,不仅它们使构建不那么漂亮,而且它们通常意味着某些东西是错误的,各种不确定的行为可能很快就会让你感到厌烦.另一方面,如何通过写出它的定义来使lambda 更加定义?
在我看来,这是一个编译器故障。使用 Visual Studio 2017 的 Clang 编译器,对于 main 函数中的 a 和 b 实例化,只会生成此错误“无法在没有模板参数列表的情况下引用类模板 'foo'”。如果将函数类型指定为模板参数,则不会出现警告和错误。
归档时间: |
|
查看次数: |
1061 次 |
最近记录: |