По умолчанию GCC и Clang обрабатывают исходный файл как UTF-8. Ваш Linux-терминал, скорее всего, также настроен на UTF-8. Таким образом, при cout<< "привет" есть строка UTF-8, которая печатается на терминале UTF-8, все хорошо.
wcout<< L"привет" зависит от конфигурации Locale, чтобы преобразовать широкие символы в кодировку символов терминала. Язык должен быть инициализирован для того, чтобы преобразование работало (default "classic" aka "C" locale не знает, как конвертировать широкие символы). Используйте std::locale::global (std::locale ("")), чтобы Locale соответствовала конфигурации среды или std::locale::global (std::locale ("en_US.UTF-8")), чтобы использовать определенный язык (подобный этому примеру C).
Здесь полный источник рабочей программы:
#include <iostream>
#include <locale>
using namespace std;
int main() {
std::locale::global (std::locale ("en_US.UTF-8"));
wcout << L"привет\n";
}
С g++ test.cc && ./a.out это печатает "привет" (на Debian Jessie).
См. также этот ответ об опасностях использования широких символов со стандартным выходом.