我一直在通過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