如果函数模板返回decltype(auto)
(或使用其他类型说明符auto
)但返回语句格式不正确,SFINAE会导致吗?return
声明是否被认为是函数签名的直接上下文?
N3690草案中的任何内容似乎都不需要这样.默认情况下,我猜SFINAE不适用.
这看起来很不幸,因为你可以编写一个函数来转发给另一个函数,但是当你写一个longhand时,你不能让它的存在以委托为条件.此外,decltype(auto)
由于this
不能在函数签名中使用,因此无法检查是否存在对等非静态成员函数.然而,这表明存在一个基本问题,因为decltype(auto)
它提供了一种在成员签名中将类类型视为完整的路径,而不是.
是否已撰写提案,或者是否已在任何地方对问题进行了正式分析?
在成员签名中将类类型视为完整的能力可能具有其他含义......但这只是另一个问题的素材.
从 C++20 开始,我们可以在auto
关键字前面加上概念的名称来限制可能的类型。特别是这种组合在类转换中是可能的operator auto
,例如
template <typename T> concept x = true;
struct S
{
operator x auto() { return 2; }
operator auto() { return 1; }
};
int main() { return S{}.operator x auto(); }
Run Code Online (Sandbox Code Playgroud)
但是 Clang 是唯一接受整个程序的编译器,但是main()
返回1
(而不是2
我预期的那样),演示:https : //gcc.godbolt.org/z/b16jYGa81
GCC 接受结构体定义,但拒绝编译S{}.operator x auto()
.
即使struct S
出现错误,MSVC 也拒绝接受:
error C2535: 'S::operator auto(void)': member function already defined or declared
Run Code Online (Sandbox Code Playgroud)
只是想知道,哪个编译器就在这里(如果有的话)?
在这个问题中讨论了为什么暴露私有类型auto
:
#include <iostream>
using namespace std;
class Base {
class PrivateClass {
public:
void bar() { cout << "PrivateClass" << endl; }
};
public:
PrivateClass foo() {
PrivateClass a;
return a;
}
};
int main() {
Base b;
auto p = b.foo();
p.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++ 11标准完全没问题.我还没有得到的是这个成语在实际应用中如何有用. 是否有问题可以有效地使用这个成语,或者它应该被视为关键词的"好奇"副作用?
我一直在玩,auto
我注意到在大多数情况下你可以用一个变量定义替换auto
,然后分配类型.
在下面的代码w
和x
都相等(默认情况下初始化int
,还是让我们无法进入潜在副本).有没有办法声明z
它具有相同的类型y
?
int w{};
auto x = int{};
int y[5];
auto z = int[5];
Run Code Online (Sandbox Code Playgroud) 我在玩auto
in std::pair
。在下面的代码中,函数f
应该返回std::pair
依赖于模板参数的类型。
一个工作示例:
例 1
template <unsigned S>
auto f()
{
if constexpr (S == 1)
return std::pair{1, 2}; // pair of ints
else if constexpr (S == 2)
return std::pair{1.0, 2.0}; // pair of doubles
else
return std::pair{0.0f, 0.0f}; // pair of floats
}
Run Code Online (Sandbox Code Playgroud)
这适用于 gcc 9.2、gcc 10.0、clang 9.0 和 clang 10.0。
接下来,std::pair
为了清楚起见,我想明确地将返回类型写为 a :
例2
template <unsigned S>
std::pair<auto, auto> f()
{
if constexpr (S == 1)
return {1, …
Run Code Online (Sandbox Code Playgroud) 我试图循环地图的条目,我得到意想不到的副本.这是程序:
#include <iostream>
#include <map>
#include <string>
struct X
{
X()
{
std::cout << "default constructor\n";
}
X(const X&)
{
std::cout << "copy constructor\n";
}
};
int main()
{
std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
std::cout << "STARTING LOOP\n";
for (const std::pair<int, X>& p : numbers)
{
}
std::cout << "ENDING LOOP\n";
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor …
Run Code Online (Sandbox Code Playgroud) 在注视GCC 4.9.0版本改变了这里,我惊喜地阅读以下; 在C++的"新语言和语言特定改进"部分下:
G ++支持N3889的§4.1.2和§5.1.1:Concepts Lite Specification所规定的无约束泛型函数.简而言之,auto可以用作任何函数声明符的参数声明中的类型说明符,以便引入隐式函数模板参数,类似于通用lambdas.
// the following two function declarations are equivalent
auto incr(auto x) { return x++; }
template <typename T>
auto incr(T x) { return x++; }
Run Code Online (Sandbox Code Playgroud)
我构建了GCC 4.9.0,我的初始测试按预期工作.我相信Concepts Lite将继续以某种方式辅助即将推出的C++ 14规范.是否有任何"无约束通用函数"计划成为C++的一部分?
标准是否允许以下内容?
#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
std::cout << a << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我遇到auto和decltype问题.
void f(const vector<int>& a, vector<float>& b)
{
typedef decltype(a[0]*b[0]) Tmp;
for (int i=0; i < b.size(); ++i) {
auto p0 = new auto(a[i]*b[i]);
auto p1 = new decltype(a[i]*b[i]);
*p0=a[i]*b[i];
*p1=a[i]*b[i];
cout<<*p0<<endl;
cout<<*p1<<endl;
delete p0;
delete p1;
}
}
int main()
{
vector<float>vec2;
vec2.push_back(2.0);
vector<int>vec1;
vec1.push_back(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在GCC4.7中运行良好.我可以使用'new auto(a [0]*b [0])'为[0]*b [0]的类型分配内存吗?在这种情况下,我无法区分decltype和auto之间的区别.
例如,我想要一个类型的变量,auto
因为我不确定它将是什么类型.
当我尝试在类/结构声明中声明它时,它给了我这个错误:
无法推断自动类型.需要初始化程序
有办法解决吗?
struct Timer {
auto start;
};
Run Code Online (Sandbox Code Playgroud)