- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我知道代码中的大括号不仅仅意味着 initializer_list
。 : What Is a Curly-Brace Enclosed List If Not an intializer_list?
但是他们应该默认什么?
例如,假设我定义了一个重载函数:
void foo(const initializer_list<int>& row_vector) { cout << size(row_vector) << "x1 - FIRST\n"; }
void foo(const initializer_list<initializer_list<int>>& matrix) { cout << size(matrix) << 'x' << size(*begin(matrix)) << " - SECOND\n"; }
如果我调用 foo({ 1, 2, 3 })
第 1st 显然会被调用。如果我调用 foo({ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } })
第二个nd 显然会被调用。
但是如果我调用:
foo({ { 1 }, { 2 }, { 3 } })
那些嵌套大括号是int
-初始化器或initializer_list<int>
初始化器? gcc says it's ambiguous但是,如果您获取该代码并在 http://webcompiler.cloudapp.net/ 上运行它Visual Studio 说它只是在构造一个 initializer_list<int>
.谁是对的?这里应该有一个默认值吗?
最佳答案
规则在[over.ics.list] :
Otherwise, if the parameter type is
std::initializer_list<X>
and all the elements of the initializer list can be implicitly converted toX
, the implicit conversion sequence is the worst conversion necessary to convert an element of the list toX
, or if the initializer list has no elements, the identity conversion.
在您的两个重载中,最糟糕的必要转换是身份转换。所以我们有两个具有等级标识的隐式转换序列。 [over.match.best]中有一条规则它更喜欢 std::initializer_list<X>
的列表初始化超过替代方案(因此 std::initializer_list<int>
比 int
更适合 {1}
),但没有任何迹象表明该规则应该递归应用。
由于没有任何东西可以消除两个转换序列的歧义,因此调用是不明确的。 gcc 和 clang 正确拒绝。
关于c++ - 这实际上是模棱两可的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795374/
我从一所大学获得了一些示例代码,导入了项目并尝试运行测试:方法 assertThat(Integer, Matcher) 对于 MyClass 类型是不明确的 每个 assertThat 都被标记为红
关于将 iOS 应用程序迁移到 Swift 3.0 的过程。这是我面临的一个问题。 先上相关代码: let calendar = NSCalendar.current, calendCompo = c
我刚开始研究 Java 8 Lambda 功能。我在 Java 7 中编写了这段代码,并尝试在 lamdas 中执行它。请注意,最后一行会产生编译错误,因为重载的函数不明确。我明白原因。如何使用 la
如何优先(告诉编译器)使用“函数接收引用”(#B)而不是“函数接收值”(#A)? #include using namespace std; class Heavy{/* ...... */}; /
我正在使用 Google Map API V3 显示车辆行驶路径及其路线方向。但是通过谷歌方向图标,很难找到方向。下图解释更多 我看到了每个图标,它是 source 我找到了图片路径,是 http:/
我是一名优秀的程序员,十分优秀!