c++ - 在 C++ 中乘以用户定义的数组

标签 c++ c++11

<分区>

我有以下代码:

#include <iostream>
#include <array>

typedef std::array<int, 2> eval_t;
eval_t operator*(eval_t e1, eval_t e2) { return {e1[0] * e2[0], e1[1] * e2[1]}; }

int main()
{
    eval_t a = {1, 2};
    eval_t b = a * {2, 1};
    std::cout << "b = (" << b[0] << ',' << b[1] << ')' << std::endl;
}

GCC 拒绝编译我的乘法:

$ g++ -std=c++11 test.cc 
test.cc: In function ‘int main()’:
test.cc:10:17: error: expected primary-expression before ‘{’ token
  eval_t b = a * {2, 1};
                 ^

我天真地希望唯一可能的 operator*() 将 eval_t 作为左操作数,将是我定义的那个,而右操作数将被理解为 eval_t.

相反,如果我写:

eval_t a = {1, 2};
eval_t v = {2, 1};
eval_t b = a * v;

有效。

最佳答案

std::array 是一个集合,它没有像其他容器一样接受 std::initializer_list 作为参数的构造函数,因此程序无法创建来自 initializer_listeval_t。因此,编译器无法找到匹配的运算符重载函数类型,因此失败。

由于这个原因,{1, 2} 不能像您预期的那样隐式转换为 eval_t

按照标准,二元运算符不允许使用纯大括号初始化器,因此编译器会拒绝它。但在 return 语句中是允许的。此答案中解释了更多详细信息:Initializer lists and RHS of operators

如果你改变语句如下,它会起作用

eval_t b = a * eval_t{{2, 1}};

关于c++ - 在 C++ 中乘以用户定义的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959594/

相关文章:

C++ 非阻塞异步定时器

c++ - 如何从构造函数捕获异常而不处理整个函数?

c++ - volatile 但不 protected 读取能否产生无限期的陈旧值? (在真实硬件上)

c++ - 为什么人们会在声明范围之外使用 lambda 或从声明范围调用的函数?

c++ - 使用 boost::proto 构建 s-expression

c++ - C++编译器如何保证常量成员变量的线程安全?

c++ - 如何修复 YouCompleteMe 错误突出显示 "cout"用法的错误?

c++ - 从 std::string 转换为 SAString

c++ - 有没有办法在c++03中模拟c++11 'override'说明符的效果?

c++ - 批评我的并发队列