- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码被 MSVC 2017 拒绝(但被 GCC/Clang 接受):
class BA
{
private:
operator int() const;
};
template <typename A, typename B>
class Builder {};
template <typename C>
struct Concatenable;
template <int N> struct Concatenable<char[N]>
{
using type = char[N];
};
template <int N> struct Concatenable<const char [N]>
{
using type = const char[N];
};
template <> struct Concatenable<BA>
{
using type = char *;
};
template<typename A, typename B>
Builder<typename Concatenable<A>::type, typename Concatenable<B>::type>
operator+(const A &, const B &)
{
return {};
}
int main()
{
BA ba;
char array[] = {'a', 'b'};
ba + array;
}
错误:
example.cpp
40 : <source>(40): error C2666: 'operator +': 2 overloads have similar conversions
31 : <source>(31): note: could be 'Builder<char *,char [2]> operator +<BA,char[2]>(const A &,const B (&))'
with
[
A=BA,
B=char [2]
]
40 : <source>(40): note: or 'built-in C++ operator+(__int64, char [2])'
40 : <source>(40): note: while trying to match the argument list '(BA, char [2])'
40 : <source>(40): note: note: qualification adjustment (const/volatile) may be causing the ambiguity
看起来 MSVC 正在考虑将 char[2]
调整为 const char (&)[2]
并不比 BA
更好int
转换。根据我对标准的阅读,这不应该是真的。
[over.ics.rank] 表示标准转换序列总是比用户定义的转换序列更好的转换;现在:
operator+
使用了两个标准的转换序列ptrdiff_t, char *
)一个用户定义的转换序列和一个标准的转换序列因此,根据[over.match.best]中的规则,我的operator+
总是不比另一个差,而且对于某些论点来说更好,所以应该优先考虑。
注意把BA
中的operator int
去掉,或者类似的把数组改成const char[]
,或者把第二个参数改成operator+
使用非常量 B&
让 MSVC 开心。
我没看到什么?
最佳答案
隐式转换序列在每个参数的基础上进行比较。您不会将一个论点的 ICS 与另一个论点的 ICS 进行比较。当您试图确定哪个重载具有更好的第二个参数网络的 ICS 时,第一个参数的 ICS 是无关紧要的。
如果 X 在任何参数上不比 Y 差并且至少在一个参数上更好(忽略各种后期决胜局),则重载 X 优于重载 Y。如果一个重载对于一个论点具有更好的 ICS,但对于另一个论点具有更差的 ICS,那么两者都不比另一个好。
正如在 Slack 聊天中讨论的那样,这里的问题是 MSVC 错误地应用了 ICS-comparison tiebreaker这应该只适用于比较两个引用绑定(bind)。这使得内置函数在第二个参数上具有更好的 ICS。这是一个打破平局的标准转换序列并不重要;它仍然更好。
更多例子:
void f(int, ...); // #1
void f(double, char); // #2
f(10, 'c'); // ambiguous: #1 is better for the first argument
// #2 is better for the second argument
struct C { operator int() const; };
void g(C, int); // #1
void g(int, double); // #2
g(C(), 1.0); // ambiguous: #1 is better for the first argument
// #2 is better for the second argument
关于c++ - 重载分辨率 : is adjusting for const/ref not better than a user-defined conversion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47902452/
我循环遍历字符串列表以查看该字符串是否包含在字典的值中,然后尝试从该值中删除该字符串。 目前我是这样做的: Dictionary formValues = new Dictionary(); form
我正在将一些旧的 Java 4 代码更新到 Java 8(这里粘贴的太多了),最初的程序员选择让他们的几乎每个类都扩展这个只有静态方法和常量的巨大类,但我不知道他们的推理。 例如: public cl
在使用 z3 解决整数实数约束时,以下两种编写(等效)约束的方法中哪一种更可取(性能方面)? (断言(=>(和( (and (<= (/1.0 1024.0) value) (< value (/1.
我知道这是一个会引起很多争论的话题,但我想知道人们认为使用对象数据源的各种利弊是什么。我现在正在和另一个程序员做一个项目,他的经验和舒适度都 Root 于经典的 ASP,我不确定哪种方式会 a) 快速
抱歉,这是comp-sci 101的问题。我只是不确定是否缺少明显的东西。 因此,假设某些用户输入引发了错误,而我想捕获它并返回一些反馈。错误将是一个数字,0-8。0表示“无错误”。如果错误为3(假设
我们的 JSF Web 应用程序中有多个具有类似功能的搜索页面: 他们有搜索结果(将这些对象称为 T) 有一个包含搜索条件的对象(将此对象称为 C) 他们能够用名称保存搜索条件(将此对象称为 S) 所
我想创建一系列从基础对象继承或复制实例属性的对象。这使我决定使用哪种模式,我想询问您对哪种方法“更好”的看法。 //APPLY: // --------------------------------
我正在构建我的第一个 android 应用程序,也是我的第一个 Java 应用程序。我似乎无法理解枚举和数组列表之间的区别。我正在构建一个简单的闪存卡应用程序,它将包含带有问题的闪存卡,并将其存储为图
我有来自不同来源的客户和潜在客户,我需要弄清楚客户是否已经注册为潜在客户。 我使用 12 个字段进行匹配: address1_clear address2_clear address_clear co
Python 中最好的文字定界符是什么?为什么?单 ' 还是双 "?最重要的是,为什么? 我是 Python 的初学者,我正在努力坚持使用一个。我知道在 PHP 中,例如 "是首选,因为 PHP 不会
这个问题在这里已经有了答案: how to compare two optional NSArrays in Swift (4 个答案) 关闭 6 年前。 我正试图找到一种更好的方法来测试平等性。我
当您有一个表示为数组的循环缓冲区,并且您需要环绕索引(即,当您达到可能的最高索引并递增它时),是否“更好”: return (++i == buffer.length) ? 0: i; 或者 retu
有没有更好的(即更易读的)方式来写这个? if (isset($input_vars['directive']) && $input_vars['directive'] == 'edit') { 最佳
如果我必须在一个句子中找到 let's say a word,我可以想到两种方法 使用 string.IndexOf 使用正则表达式 哪个在性能或最佳实践方面更好 最佳答案 如果不用正则表达式做某事相
我通常知道两种用 C 语言设计通用链表数据结构的方法。我想知道哪种方法更好。在提问之前,我将简要介绍这两种方法: 一种方法是围绕如下结构构建函数: struct list_element {
我总是假设将 double 除以整数会导致更快的代码,因为编译器会选择更好的微码来计算: double a; double b = a/3.0; double c = a/3; // will com
有时,Border控制或 Rectangle控制将满足我的需求。一个例子是,当我正在实现 ControlTemplate 并且我已经在应用分层技术(即在网格中堆叠控件)时,我不需要将不同的 Radiu
代码 (Java) 片段 ..... ..... if ( response.check() == checkNumber ) { String message = "You ar
投资组合A→基金1 投资组合A→基金2 投资组合A→基金3 如果不使用is/has,我就无法框定我的句子。但是在1和2之间 1)具有: class PortfolioA { List obj;
我只是想知道哪个更好,或者更推荐用于处理表单数据。 // Controller // validation etc $data = array('name'=>$this->input->post('
我是一名优秀的程序员,十分优秀!