我一直在通过Bjarne Stroustrup的“C++游览”学习C++ 11。为什么在这种情况下创建临时实例不起作用?
我的代码
#include <random>
#include <functional>
int main(int argc, char *argv[])
{
using namespace std;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution {1,6};
distribution(generator); //Case 1 works
auto die = bind(uniform_int_distribution<>{1,6},default_random_engine{}); //Case 2 works
distribution(std::default_random_engine{}); //Case 3 Compiler error
}
案例3是我自己创作的,而案件2来自书本和案例1我改编自别处下面的代码片段。 为什么case 3在下面产生编译器错误? 据我了解,情况1和情况3之间的唯一区别是,我使用std :: default_random_engine的一个临时实例,并且此临时实例似乎在情况下工作2 我错过了什么?
错误输出:
random.cpp: In function ‘int main(int, char**)’:
random.cpp:13:46: error: no match for call to ‘(std::uniform_int_distribution<int>) (std::default_random_engine)’
distribution(std::default_random_engine{}); //Case 3 Compiler error
^
In file included from /usr/include/c++/6.3.1/bits/random.h:35:0,
from /usr/include/c++/6.3.1/random:49,
from random.cpp:1:
/usr/include/c++/6.3.1/bits/uniform_int_dist.h:164:2: note: candidate: std::uniform_int_distribution<_IntType>::result_type std::uniform_int_distribution<_IntType>::operator()(_UniformRandomNumberGenerator&) [with _UniformRandomNumberGenerator = std::linear_congruential_engine<long unsigned int, 16807ul, 0ul, 2147483647ul>; _IntType = int; std::uniform_int_distribution<_IntType>::result_type = int] <near match>
operator()(_UniformRandomNumberGenerator& __urng)
^~~~~~~~
/usr/include/c++/6.3.1/bits/uniform_int_dist.h:164:2: note: conversion of argument 1 would be ill-formed:
random.cpp:13:23: error: invalid initialization of non-const reference of type ‘std::linear_congruential_engine<long unsigned int, 16807ul, 0ul, 2147483647ul>&’ from an rvalue of type ‘std::default_random_engine {aka std::linear_congruential_engine<long unsigned int, 16807ul, 0ul, 2147483647ul>}’
distribution(std::default_random_engine{}); //Case 3 Compiler error
^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/6.3.1/bits/random.h:35:0,
from /usr/include/c++/6.3.1/random:49,
from random.cpp:1:
/usr/include/c++/6.3.1/bits/uniform_int_dist.h:169:2: note: candidate: template<class _UniformRandomNumberGenerator> std::uniform_int_distribution<_IntType>::result_type std::uniform_int_distribution<_IntType>::operator()(_UniformRandomNumberGenerator&, const std::uniform_int_distribution<_IntType>::param_type&) [with _UniformRandomNumberGenerator = _UniformRandomNumberGenerator; _IntType = int]
operator()(_UniformRandomNumberGenerator& __urng,
^~~~~~~~
/usr/include/c++/6.3.1/bits/uniform_int_dist.h:169:2: note: template argument deduction/substitution failed:
random.cpp:13:46: note: candidate expects 2 arguments, 1 provided
distribution(std::default_random_engine{}); //Case 3 Compiler error
^
您不能将可变引用绑定到临时对象。案例3试图做到这一点 – Justin
检查例如[this'uniform_int_distribution :: operator()'引用](http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/operator%28%29)。分布的参数是一个非常量引用,临时对象不能被这些引用绑定。 –
谢谢!所以在方法需要const引用的情况下,我可以使用case 3的形式? – Avatar33