c++ - 错误: Cannot use parentheses when declaring variable with deduced class template specialization type

标签 c++ template-argument-deduction

下午好!有人可以解释为什么使用仅传递一个 vector 的函数时会发生错误吗?

嗯,也就是说,您可以轻松地传输常量:3、“asdf”2.3 等,但命名变量则不然。但由于某种原因,杂交是可能的。为什么这突然成为可能?

#include <iostream>
#include <vector>

template<typename... Args>
struct func
{
  func(const Args&... args)
  {
    std::cout << "ok" << std::endl;
  }
};

template <typename... Args>
func(Args...) -> func<Args...>;

int main() 
{
  const std::vector<int> v { 1, 2, 3 };
  func(v);      // error is here
  func(v, 3);   // no error
  func("asdf"); // no error
}

错误:使用推导的类模板专门化类型声明变量时无法使用括号

示例:https://godbolt.org/z/jdnce5Gdv

最佳答案

clang 的错误消息非常具体 - g++ 和 vc++ 仅提示 v 的声明冲突 - 但请注意,它说“声明一个变量”。

由于 func 是一种类型,并且您可以在变量声明中的标识符周围使用括号,并且由于“如果它可以被解释为声明,那么它就是 声明”规则,

func(v);

相当于

func v;

声明 func 类型的变量 v

以下是相同情况的简短示例:

#include <vector>

int main() {
    int v = 0;
    std::vector<int>(v);
}

关于c++ - 错误: Cannot use parentheses when declaring variable with deduced class template specialization type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71448160/

相关文章:

c++ - 排序数组——issue

c++ - 函数调用顺序。它是编译器还是取决于情况?

c++ - 如何将视频帧保存到缓冲区中?

c++ - 在多参数情况下使用转换构造函数

c++ - 推导用户定义值模板参数(C++2a,P0732R2)

c++ - 在 Eigen 中复制模板化函数参数

c++ - 如何交换STM32L475闪存中不同存储体的两个存储区域?

c++ - 静态库 (/MT) 链接与项目/MTd 选项冲突

c++ - 自动参数捕获的推导规则是什么?

c++ - 模板推导 : const reference and const pointer