SFINAE转换函数触发Clang诡异警告的原因探究
关于Clang对模板化转换函数的警告问题
示例代码
#include <type_traits> template <bool B> struct S { // #1 // template <bool C = B, class = std::enable_if_t<!C>> // operator S<true>() const { return {}; } // #2 // operator S<true>() const { return {}; } }; int main() { S<true> b1; S<false> b2; }
不同编译器的表现
GCC编译情况
无论启用#1、#2还是同时启用,编译都不会产生警告。原本预期启用#2时会出现自转换函数相关警告,但GCC并未实现该类型的警告。
Clang编译情况
仅启用#1时会触发如下错误级警告:
error: conversion function converting 'S' to itself will never be used [-Werror,-Wclass-conversion]
但启用#2时不会触发该警告;此外,即使注释掉main函数里b1或b2的实例化代码,这个警告依然会出现。
疑问
这一现象的原因是什么?是否属于Clang的bug?
编辑说明:我核心关注的是为什么#1会引发这个警告,其他信息都是我为缩小问题范围做的尝试。
内容的提问来源于stack exchange,提问作者Baruch
相关产品推荐
相关产品推荐

